Meneroka instance, concurrency dan throttling di WCF

Semasa bekerja di WCF, anda harus mengetahui konsep instance, throttling, and concurrency untuk membina perkhidmatan yang dapat ditingkatkan dan dapat memberikan hasil yang lebih baik.

Throttling dalam WCF digunakan untuk membatasi throughput perkhidmatan sehingga penggunaan sumber daya (memori, pemproses, cakera, rangkaian, dll.) Dalam sistem berada pada tahap yang dapat diterima, iaitu memastikan perkhidmatan tidak menggunakan sumber daya melebihi had yang dapat diterima. Kelas ServiceThrottlingBehavior boleh digunakan untuk mengawal prestasi perkhidmatan WCF.

Serentak

Di WCF, masalah serentak boleh timbul apabila dua atau lebih utas cuba mengakses sumber yang sama pada masa yang sama. Perhatikan bahawa perkhidmatan WCF dapat menangani satu permintaan sekali gus. Kesesuaian dalam WCF membolehkan anda mengawal beberapa utas aktif dalam InstanceContext pada satu masa tertentu. Pada dasarnya, ini membantu anda untuk mengkonfigurasi jumlah contoh perkhidmatan yang dapat melayani beberapa permintaan serentak. Tiga jenis mod serentak yang mungkin termasuk yang berikut:

Mod serentak tunggal: Dalam mod ini, setiap konteks contoh boleh memiliki maksimum satu utas yang dapat memproses permintaan pada titik waktu tertentu. Apabila permintaan berikutnya tiba, ia harus menunggu hingga permintaan pertama selesai. Ini juga memerlukan keperluan kunci penyegerakan. Coretan kod berikut menggambarkan bagaimana mod serentak tunggal dapat digunakan.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]

Perkhidmatan kelas awam: IServiceContract

{

     rentetan awam GetMessage ()

     {

          kembali "Hello World!";

     }

}

Mod serentak berganda: Dalam mod ini, perkhidmatan membolehkan beberapa utas mengakses operasi perkhidmatan pada waktu yang sama. Dalam mod operasi berganda serentak, setiap perkhidmatan WCF mempunyai banyak utas yang pada gilirannya dapat memproses permintaan masuk secara serentak.

[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;

    }

}

Mod reentrant reurrrant: Dalam modus reentrant, walaupun satu utas dapat mengakses objek perkhidmatan, utas masih dapat keluar dari perkhidmatan dan kemudian memanggil perkhidmatan lain. Coretan kod berikut menunjukkan bagaimana anda dapat melaksanakan mod ini.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]

public class Service : IServiceContract

{

     public string GetMessage()

     {

          return "Hello World!";

     }

}

Properti InstanceContextMode digunakan untuk menentukan kapan contoh perkhidmatan akan dibuat dan ketahanannya. Perhatikan bahawa kedua-dua InstanceContextMode dan ConcurrencyMode ditentukan menggunakan ServiceBehaviorAttribute. Tiga nilai mod konteks contoh yang ada termasuk: PerCall, PerSession dan Single. Dalam mod PerCall, perkhidmatan ini mempunyai rangkaian tunggal dan tanpa status. Mod PerSession adalah lalai dan digunakan apabila anda ingin mengekalkan maklumat keadaan antara panggilan yang berasal dari pengguna perkhidmatan yang sama. Mod Tunggal digunakan apabila perkhidmatan anda perlu mengekalkan maklumat keadaan di seluruh pelanggan dan anda tidak perlu meningkatkan perkhidmatan anda di masa depan.

Pendikit

Anda dapat memanfaatkan pendikit untuk mengawal dan mengoptimumkan penggunaan sumber dan juga untuk mencapai cara untuk mengimbangkan prestasi perkhidmatan. Throttling di WCF dapat dikonfigurasi secara deklaratif dan juga secara terprogram.

Anda boleh mengkonfigurasi sifat maxConcurrentCalls, maxConcurrentInstances, maxConcurrentSessions secara deklaratif menggunakan tag dalam fail konfigurasi perkhidmatan seperti yang ditunjukkan dalam coretan kod 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.