Penyeimbangan Beban

Salah satu cara untuk meningkatkan kapasitas aplikasi Windows Communication Foundation (WCF) adalah dengan menskalakannya dengan menyebarkannya ke farm server yang seimbang beban. Aplikasi WCF dapat diseimbangkan bebannya menggunakan teknik penyeimbangan beban standar, termasuk penyeimbang beban perangkat lunak seperti Windows Network Load Balancing serta appliance penyeimbang beban berbasis perangkat keras.

Bagian berikut membahas pertimbangan untuk menyeimbangkan beban aplikasi WCF yang dibangun menggunakan berbagai pengikatan yang disediakan sistem.

Penyeimbangan Beban dengan Pengikatan HTTP Dasar

Dari perspektif penyeimbangan beban, aplikasi WCF yang berkomunikasi menggunakan BasicHttpBinding tidak berbeda dari jenis lalu lintas jaringan HTTP umum lainnya (konten HTML statis, halaman ASP.NET, atau Layanan Web ASMX). Saluran WCF yang menggunakan pengikatan ini secara inheren tanpa status, dan mengakhiri koneksinya saat saluran ditutup. Dengan demikian, BasicHttpBinding bekerja dengan baik dengan teknik penyeimbangan beban HTTP yang ada.

Secara bawaan, BasicHttpBinding mengirimkan header koneksi HTTP dalam pesan dengan nilai Keep-Alive, yang memungkinkan klien untuk membangun koneksi persisten ke layanan yang mendukung mereka. Konfigurasi ini menawarkan throughput yang ditingkatkan karena koneksi yang dibuat sebelumnya dapat digunakan kembali untuk mengirim pesan berikutnya ke server yang sama. Namun, penggunaan kembali koneksi dapat menyebabkan klien menjadi sangat terkait dengan server tertentu dalam farm yang seimbang beban, yang mengurangi efektivitas penyeimbangan beban round-robin. Jika perilaku ini tidak diinginkan, HTTP Keep-Alive dapat dinonaktifkan di server menggunakan properti KeepAliveEnabled dengan CustomBinding atau Binding yang ditentukan pengguna. Contoh berikut menunjukkan cara melakukan ini menggunakan konfigurasi.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

 <system.serviceModel>
  <services>
   <service
     name="Microsoft.ServiceModel.Samples.CalculatorService"
     behaviorConfiguration="CalculatorServiceBehavior">
     <host>
      <baseAddresses>
       <add baseAddress="http://localhost:8000/servicemodelsamples/service"/>
      </baseAddresses>
     </host>
    <!-- configure http endpoint, use base address provided by host
         And the customBinding -->
     <endpoint address=""
           binding="customBinding"
           bindingConfiguration="HttpBinding"
           contract="Microsoft.ServiceModel.Samples.ICalculator" />
   </service>
  </services>

  <bindings>
    <customBinding>

    <!-- Configure a CustomBinding that disables keepAliveEnabled-->
      <binding name="HttpBinding" keepAliveEnabled="False"/>

    </customBinding>
  </bindings>
 </system.serviceModel>
</configuration>

Menggunakan konfigurasi yang disederhanakan yang diperkenalkan dalam .NET Framework 4, perilaku yang sama dapat dicapai menggunakan konfigurasi yang disederhanakan berikut.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <system.serviceModel>
    <protocolMapping>
      <add scheme="http" binding="customBinding" />
    </protocolMapping>
    <bindings>
      <customBinding>

      <!-- Configure a CustomBinding that disables keepAliveEnabled-->
        <binding keepAliveEnabled="False"/>

      </customBinding>
    </bindings>
 </system.serviceModel>
</configuration>

Untuk informasi selengkapnya tentang titik akhir, pengikatan, dan perilaku default, lihat Konfigurasi Yang Disederhanakan dan Konfigurasi Yang Disederhanakan untuk Layanan WCF.

Penyeimbangan Muatan dengan Pengikatan WSHttp dan Pengikatan WSDualHttp

Baik WSHttpBinding maupun WSDualHttpBinding dapat disesuaikan bebannya menggunakan teknik penyeimbangan beban HTTP, asalkan beberapa modifikasi dilakukan pada konfigurasi pengikatan bawaan.

  • Nonaktifkan Pembentukan Konteks Keamanan atau gunakan sesi keamanan berstatus. Pembentukan Konteks Keamanan dapat dinonaktifkan dengan menetapkan properti EstablishSecurityContext pada WSHttpBinding sebagai false. Jika Anda menggunakan WSDualHttpBinding atau sesi keamanan diwajibkan, dimungkinkan untuk menggunakan sesi keamanan berbasis status seperti dijelaskan dalam Secure Sessions. Sesi keamanan stateful memungkinkan layanan tetap stateless, karena semua status untuk sesi keamanan dikirimkan dengan setiap permintaan sebagai bagian dari token keamanan perlindungan. Untuk mengaktifkan sesi keamanan stateful, Anda harus menggunakan CustomBinding atau Binding yang ditentukan pengguna, karena pengaturan konfigurasi yang diperlukan tidak diekspos pada WSHttpBinding dan WSDualHttpBinding yang disediakan oleh sistem.

  • Jika Anda menonaktifkan Pembentukan Konteks Keamanan, Anda juga perlu menonaktifkan Negosiasi Kredensial Layanan. Untuk menonaktifkannya, atur properti NegotiateServiceCredential pada WSHttpBinding menjadi false. Untuk menonaktifkan Negosiasi Kredensial Layanan, Anda mungkin perlu secara eksplisit menentukan identitas titik akhir pada klien.

  • Jangan gunakan sesi yang dapat diandalkan. Fitur ini nonaktif secara default.

Penyeimbangan Beban Pengikatan Net.TCP

NetTcpBinding dapat diseimbangkan bebannya menggunakan teknik penyeimbangan beban lapisan IP. Namun, secara default, NetTcpBinding mengumpulkan koneksi TCP untuk mengurangi latensi koneksi. Ini adalah pengoptimalan yang mengganggu mekanisme dasar penyeimbangan beban. Nilai konfigurasi utama untuk mengoptimalkan NetTcpBinding adalah batas waktu sewa, yang merupakan bagian dari Pengaturan Kumpulan Koneksi. Penyatuan koneksi menyebabkan koneksi klien dikaitkan dengan server tertentu dalam suatu farm. Ketika masa pakai koneksi tersebut meningkat (faktor yang dikendalikan oleh pengaturan batas waktu sewa), distribusi beban di berbagai server di farm menjadi tidak seimbang. Akibatnya rata-rata waktu panggilan meningkat. Jadi saat menggunakan NetTcpBinding dalam skenario penyeimbangan beban, pertimbangkan untuk mengurangi batas waktu sewa default yang digunakan oleh pengikatan. Batas waktu sewa 30 detik adalah titik awal yang wajar untuk skenario yang seimbang beban, meskipun nilai optimalnya tergantung pada aplikasi. Untuk informasi selengkapnya tentang batas waktu sewa saluran dan kuota transportasi lainnya, lihat Kuota Transportasi.

Untuk performa terbaik dalam skenario seimbang beban, pertimbangkan untuk menggunakan NetTcpSecurity (baik Transport atau TransportWithMessageCredential).

Lihat juga