חקר ההתחייבות, המקביל והמצערת ב- WCF

כשאתה עובד ב- WCF, עליך להיות מודע למושגים של הזדמנות, חנק, ובמקביל לבנות שירותים הניתנים להרחבה ויכולים לספק תפוקה טובה יותר.

מצערת ב- WCF משמשת להגבלת תפוקת השירות כך שצריכת המשאבים (זיכרון, מעבד, דיסק, רשת וכו ') במערכת תהיה ברמה מקובלת, כלומר, להבטיח שהשירות אינו צורך משאבים מעבר למגבלות המקובלות. ניתן להשתמש במחלקת ServiceThrottlingBehavior בכדי לשלוט על ביצועי שירותי WCF.

מקביליות

ב- WCF, בעיות במקביל יכולות להתעורר כששני שרשורים או יותר מנסים לגשת לאותו משאב בו זמנית. שים לב ששירות WCF יכול לטפל בבקשה אחת בכל פעם. מקביליות ב- WCF מאפשרת לך לשלוט במספר שרשורים פעילים ב- InstanceContext בנקודת זמן מסוימת. למעשה, זה עוזר לך להגדיר את מספר מופעי השירות שיכולים לשרת מספר בקשות בו זמנית. שלושת הסוגים האפשריים של מצבי מקביליות כוללים את הדברים הבאים:

מצב מקביליות יחיד: במצב זה לכל הקשר של מופע יכול להיות מקסימום שרשור אחד שיכול לעבד את הבקשה בנקודת זמן מסוימת. כאשר מגיעה הבקשה הבאה, עליה להמתין עד להשלמת הבקשה הראשונה. זה גם מעלה את הצורך במנעולי סינכרון. קטע הקוד הבא ממחיש כיצד ניתן להשתמש במצב חד פעמי.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]

שירות ברמה ציבורית: IServiceContract

{

     מחרוזת ציבורית GetMessage ()

     {

          להחזיר "שלום עולם!";

     }

}

מצב מקביליות מרובה: במצב זה, השירות מאפשר למספר שרשורים לגשת לפעולת שירות באותה נקודת זמן. במצב הפעולה המקבילי המרובה, לכל שירות WCF יש מספר אשכולות אשר בתורם יכולים לעבד את הבקשות הנכנסות במקביל.

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

    }

}

מצב הכנסה חוזרת למצב חוזר: במצב הפעולה מחדש, למרות ששרשור יחיד יכול לגשת לאובייקט השירות, השרשור עדיין יכול לצאת מהשירות ואז להתקשר לשירות אחר. קטע הקוד הבא מראה כיצד ניתן ליישם מצב זה.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]

public class Service : IServiceContract

{

     public string GetMessage()

     {

          return "Hello World!";

     }

}

המאפיין InstanceContextMode משמש כדי לציין מתי ייווצר מופע של השירות ואת עמידותו. שים לב כי הן InstanceContextMode והן ConcurrencyMode מוגדרים באמצעות מאפיין ServiceBehaviorAttribute. שלושת ערכי מצב ההקשר המופע הזמינים כוללים: PerCall, PerSession ו- Single. במצב PerCall, השירות הוא הברגה אחת והוא חסר מדינה. מצב PerSession הוא ברירת המחדל והוא משמש כאשר ברצונך לשמור על מידע מצב בין שיחות שמקורן באותו צרכן שירות. נעשה שימוש במצב יחיד כאשר השירות שלך צריך לשמור על מידע מצב בין לקוחות ולא תצטרך להגדיל את השירות שלך בעתיד.

חנק

באפשרותך למנף את המצערת כדי לשלוט ולייעל את השימוש במשאבים וגם כדי להשיג דרך לאזן בין ביצועי השירות. ניתן להגדיר את המצער ב- WCF באופן הצהרתי כמו גם מבחינה תכנותית.

באפשרותך להגדיר את המאפיינים maxConcurrentCalls, maxConcurrentInstances, maxConcurrentSessions באופן הצהרתי באמצעות התג בקובץ תצורת השירות כפי שמוצג בקטע הקוד שלמטה.

   

     

       

         

           

         

       

       

     

   

   

     

       

         

         

         

                                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.