Menjelajahi instancing, konkurensi, dan throttling di WCF

Saat bekerja di WCF, Anda harus mengetahui konsep instancing, pembatasan, dan konkurensi untuk membangun layanan yang dapat diskalakan dan dapat memberikan hasil yang lebih baik.

Pembatasan di WCF digunakan untuk membatasi throughput layanan sehingga konsumsi sumber daya (memori, prosesor, disk, jaringan, dll.) Dalam sistem berada pada tingkat yang dapat diterima, yaitu, memastikan layanan tidak mengonsumsi sumber daya melebihi batas yang dapat diterima. Kelas ServiceThrottlingBehavior dapat digunakan untuk mengontrol kinerja layanan WCF.

Konkurensi

Di WCF, masalah konkurensi dapat muncul ketika dua atau lebih utas mencoba mengakses sumber daya yang sama pada waktu yang sama. Perhatikan bahwa layanan WCF dapat menangani satu permintaan dalam satu waktu. Concurrency di WCF memungkinkan Anda mengontrol beberapa utas aktif dalam InstanceContext pada titik waktu tertentu. Intinya, ini membantu Anda mengonfigurasi jumlah instance layanan yang dapat melayani beberapa permintaan bersamaan. Tiga jenis mode konkurensi yang mungkin meliputi:

Mode konkurensi tunggal: Dalam mode ini, setiap konteks instance dapat memiliki maksimal satu utas yang dapat memproses permintaan pada titik waktu tertentu. Ketika permintaan berikutnya tiba, itu harus menunggu sampai permintaan pertama selesai. Ini juga menimbulkan kebutuhan kunci sinkronisasi. Cuplikan kode berikut menggambarkan bagaimana mode konkurensi tunggal dapat digunakan.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]

Layanan kelas publik: IServiceContract

{

     string publik GetMessage ()

     {

          kembali "Hello World!";

     }

}

Beberapa mode konkurensi: Dalam mode ini, layanan memungkinkan beberapa utas mengakses operasi layanan pada titik waktu yang sama. Dalam mode operasi serentak ganda, setiap layanan WCF memiliki beberapa utas yang pada gilirannya dapat memproses permintaan yang masuk secara bersamaan.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]

public class Service : IServiceContract

{

    readonly object lockObj = new object();

    public string GetMessage()

    {

        string message = string.Empty;

        lock (lockObj)

        {

             message = "Hello World!";

        }

        return message;

    }

}

Mode konkurensi reentrant : Dalam mode operasi reentrant, meskipun satu thread dapat mengakses objek layanan, thread masih dapat keluar dari layanan dan kemudian memanggil layanan lain. Cuplikan kode berikut menunjukkan bagaimana Anda dapat menerapkan mode ini.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]

public class Service : IServiceContract

{

     public string GetMessage()

     {

          return "Hello World!";

     }

}

Properti InstanceContextMode digunakan untuk menentukan kapan sebuah instance layanan akan dibuat dan daya tahannya. Perhatikan bahwa InstanceContextMode dan ConcurrencyMode ditentukan menggunakan ServiceBehaviorAttribute. Tiga nilai mode konteks contoh yang tersedia meliputi: PerCall, PerSession dan Single. Dalam mode PerCall, layanan ini berulir tunggal dan tanpa kewarganegaraan. Mode PerSession adalah default dan digunakan ketika Anda ingin mempertahankan informasi status antara panggilan yang berasal dari konsumen layanan yang sama. Mode Tunggal digunakan saat layanan Anda perlu mempertahankan informasi status di seluruh klien dan Anda tidak perlu memperluas layanan Anda di masa mendatang.

Pembatasan

Anda dapat memanfaatkan pelambatan untuk mengontrol dan mengoptimalkan penggunaan sumber daya dan juga untuk mencapai cara menyeimbangkan kinerja layanan. Throttling di WCF dapat dikonfigurasi secara deklaratif serta secara terprogram.

Anda dapat mengonfigurasi properti maxConcurrentCalls, maxConcurrentInstances, maxConcurrentSessions secara deklaratif menggunakan tag di file konfigurasi layanan seperti yang ditampilkan dalam cuplikan kode di bawah.

   

     

       

         

           

         

       

       

     

   

   

     

       

         

         

         

                                maxConcurrentInstances

                                maxConcurrentSessions/>

       

     

   

The maxConcurrentCalls property is used to limit the total number of calls across all the service instances. The default value is 16 per processor. The maxConcurrentInstances property is used to specify the total number of service instances that can be allocated at a particular point of time. The default value of this property is Int32.MaxValue. The maxConcurrentSessions property is used to specify the total number of concurrent active sessions that is permissible for a service at a given point of time. The default value is 100 per processor.

Now that we know how to configure service throttling in WCF declaratively, let’s explore how we can configure service throttling in WCF programmatically. To configure service throttling in WCF programmatically, you would need to take advantage of the ServiceThrottlingBehavior class. The following code listing shows how you can take advantage of the ServiceThrottlingBehavior class to configure the concurrent calls, session and instance properties.

ServiceHost serviceHost = new ServiceHost(typeof(Service));

           ServiceThrottlingBehavior throttleBehavior = serviceHost.Description.Behaviors.Find();

            if (throttleBehavior == null)

            {

                throttleBehavior = new ServiceThrottlingBehavior();

                throttleBehavior.MaxConcurrentCalls = 1000;

                throttleBehavior.MaxConcurrentSessions = 250;

                throttleBehavior.MaxConcurrentInstances = 500;

              serviceHost.Description.Behaviors.Add(throttleBehavior);

            }

In the above code snippet, an instance of ServiceThrottlingBehavior is created and its properties set to the appropriate values. Next, this instance is added to the Behaviors collection of the service host instance.