Προγραμματισμός

Εξερεύνηση στιγμιότυπων, ταυτόχρονης λειτουργίας και επιτάχυνσης στο WCF

Όταν εργάζεστε στο WCF θα πρέπει να γνωρίζετε τις έννοιες του instance, throttling και concurrency για τη δημιουργία υπηρεσιών που είναι επεκτάσιμες και μπορούν να προσφέρουν καλύτερη απόδοση.

Το Throttling στο WCF χρησιμοποιείται για τον περιορισμό της απόδοσης της υπηρεσίας έτσι ώστε η κατανάλωση πόρων (μνήμη, επεξεργαστής, δίσκος, δίκτυο κ.λπ.) στο σύστημα να είναι σε αποδεκτό επίπεδο, δηλαδή να διασφαλίσει ότι η υπηρεσία δεν καταναλώνει πόρους πέρα ​​από τα αποδεκτά όρια. Η κλάση ServiceThrottlingBehavior μπορεί να χρησιμοποιηθεί για τον έλεγχο της απόδοσης των υπηρεσιών WCF.

Συγχρονισμός

Στο WCF, προβλήματα ταυτότητας μπορεί να προκύψουν όταν δύο ή περισσότερα νήματα προσπαθούν να αποκτήσουν πρόσβαση στον ίδιο πόρο ταυτόχρονα. Σημειώστε ότι μια υπηρεσία WCF μπορεί να χειριστεί ένα μόνο αίτημα κάθε φορά. Το Concurrency στο WCF σάς επιτρέπει να ελέγχετε πολλά ενεργά νήματα σε ένα InstanceContext σε μια συγκεκριμένη χρονική στιγμή. Στην ουσία, σας βοηθά να διαμορφώσετε τον αριθμό των παρουσιών υπηρεσίας που μπορούν να εξυπηρετήσουν πολλαπλά ταυτόχρονα αιτήματα. Οι τρεις πιθανοί τύποι τρόπων ταυτότητας περιλαμβάνουν τα ακόλουθα:

Λειτουργία μεμονωμένης ταυτότητας: Σε αυτήν τη λειτουργία κάθε περιβάλλον εμφάνισης μπορεί να έχει το πολύ ένα νήμα που μπορεί να επεξεργαστεί το αίτημα σε μια συγκεκριμένη χρονική στιγμή. Όταν φτάσει το επόμενο αίτημα, πρέπει να περιμένει μέχρι να ολοκληρωθεί το πρώτο αίτημα. Αυτό συνεπάγεται επίσης την ανάγκη κλειδώματος συγχρονισμού. Το ακόλουθο απόσπασμα κώδικα απεικονίζει πώς μπορεί να χρησιμοποιηθεί μία λειτουργία ταυτόχρονης ταυτότητας.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Single)]

δημόσια τάξη Υπηρεσία: IServiceContract

{

δημόσια συμβολοσειρά GetMessage ()

     {

επιστρέψτε "Γεια Κόσμος!";

     }

}

Λειτουργία πολλαπλών ταυτόχρονων: Σε αυτήν τη λειτουργία, η υπηρεσία επιτρέπει σε πολλά νήματα να έχουν πρόσβαση σε μια λειτουργία υπηρεσίας την ίδια χρονική στιγμή. Στον τρόπο λειτουργίας πολλαπλών ταυτόχρονων, κάθε υπηρεσία WCF έχει πολλά νήματα τα οποία με τη σειρά τους μπορούν να επεξεργαστούν τα εισερχόμενα αιτήματα ταυτόχρονα.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Multiple)]

δημόσια τάξη Υπηρεσία: IServiceContract

{

readonly object lockObj = νέο αντικείμενο ();

δημόσια συμβολοσειρά GetMessage ()

    {

string message = string. Κενό;

κλειδαριά (lockObj)

        {

message = "Γεια σου Κόσμος!";

        }

μήνυμα επιστροφής;

    }

}

Λειτουργία επανεισόδου ταυτότητας: Στον τρόπο επανειλημμένης λειτουργίας, παρόλο που ένα μόνο νήμα μπορεί να έχει πρόσβαση στο αντικείμενο υπηρεσίας, το νήμα μπορεί ακόμα να βγει από την υπηρεσία και στη συνέχεια να καλέσει άλλη υπηρεσία. Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να εφαρμόσετε αυτήν τη λειτουργία.

[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Reentrant)]

δημόσια τάξη Υπηρεσία: IServiceContract

{

δημόσια συμβολοσειρά GetMessage ()

     {

επιστρέψτε "Γεια Κόσμος!";

     }

}

Η ιδιότητα InstanceContextMode χρησιμοποιείται για να καθορίσει πότε θα δημιουργηθεί μια παρουσία της υπηρεσίας και τη διάρκεια της. Σημειώστε ότι τόσο το InstanceContextMode όσο και το ConcurrencyMode καθορίζονται χρησιμοποιώντας το χαρακτηριστικό ServiceBehaviorAttribute. Οι τρεις διαθέσιμες τιμές λειτουργίας περιβάλλοντος παρουσίας περιλαμβάνουν: PerCall, PerSession και Single. Στη λειτουργία PerCall, η υπηρεσία είναι μονή με σπείρωμα και είναι απάτριδα. Η λειτουργία PerSession είναι η προεπιλεγμένη και χρησιμοποιείται όταν θέλετε να διατηρήσετε πληροφορίες κατάστασης μεταξύ κλήσεων που προέρχονται από τον ίδιο καταναλωτή υπηρεσιών. Η λειτουργία Single χρησιμοποιείται όταν η υπηρεσία σας χρειάζεται να διατηρεί πληροφορίες κατάστασης σε πελάτες και δεν θα χρειαστεί να κλιμακώσετε την υπηρεσία σας στο μέλλον.

Στρεβλώσεις

Μπορείτε να αξιοποιήσετε το γκάζι για να ελέγξετε και να βελτιστοποιήσετε τη χρήση των πόρων και επίσης να επιτύχετε έναν τρόπο εξισορρόπησης της απόδοσης των υπηρεσιών. Η πεταλούδα στο WCF μπορεί να διαμορφωθεί με δημοτικό τρόπο καθώς και μέσω προγραμματισμού.

Μπορείτε να ρυθμίσετε τις παραμέτρους των ιδιοτήτων maxConcurrentCalls, maxConcurrentInstances, maxConcurrentSessions χρησιμοποιώντας την ετικέτα στο αρχείο διαμόρφωσης υπηρεσίας, όπως φαίνεται στο παρακάτω απόσπασμα κώδικα.

   

     

       

         

           

         

       

       

     

   

   

     

       

         

         

         

maxConcurrentInstances

maxConcurrentSessions />

       

     

   

Η ιδιότητα maxConcurrentCalls χρησιμοποιείται για τον περιορισμό του συνολικού αριθμού κλήσεων σε όλες τις παρουσίες υπηρεσίας. Η προεπιλεγμένη τιμή είναι 16 ανά επεξεργαστή. Η ιδιότητα maxConcurrentInstances χρησιμοποιείται για τον καθορισμό του συνολικού αριθμού παρουσιών υπηρεσίας που μπορούν να εκχωρηθούν σε μια συγκεκριμένη χρονική στιγμή. Η προεπιλεγμένη τιμή αυτής της ιδιότητας είναι Int32.MaxValue. Η ιδιότητα maxConcurrentSessions χρησιμοποιείται για τον καθορισμό του συνολικού αριθμού ταυτόχρονων ενεργών περιόδων σύνδεσης που επιτρέπεται για μια υπηρεσία σε μια δεδομένη χρονική στιγμή. Η προεπιλεγμένη τιμή είναι 100 ανά επεξεργαστή.

Τώρα που γνωρίζουμε πώς να διαμορφώσουμε τη ρύθμιση του γκάζι υπηρεσιών στο WCF, ας εξερευνήσουμε πώς μπορούμε να ρυθμίσουμε το γκάζι υπηρεσιών στο WCF μέσω προγραμματισμού. Για να διαμορφώσετε το γκάζι υπηρεσίας στο WCF μέσω προγραμματισμού, θα πρέπει να επωφεληθείτε από την κλάση ServiceThrottlingBehavior. Η ακόλουθη λίστα κωδικών δείχνει πώς μπορείτε να επωφεληθείτε από την κλάση ServiceThrottlingBehavior για να διαμορφώσετε τις ταυτόχρονες κλήσεις, τις περιόδους σύνδεσης και την παρουσία.

ServiceHost serviceHost = νέο ServiceHost (typeof (Service));

ServiceThrottlingBehavior throttleBehavior = serviceHost.Description.Behaviors.Βρείτε ();

εάν (throttleBehavior == null)

            {

throttleBehavior = νέο ServiceThrottlingBehavior ();

throttleBehavior.MaxConcurrentCalls = 1000;

throttleBehavior.MaxConcurrentSessions = 250;

throttleBehavior.MaxConcurrentInstances = 500;

serviceHost.Description.Behaviors.Add (throttleBehavior);

            }

Στο παραπάνω απόσπασμα κώδικα, δημιουργείται μια παρουσία του ServiceThrottlingBehavior και οι ιδιότητές του ορίζονται στις κατάλληλες τιμές. Στη συνέχεια, αυτή η παρουσία προστίθεται στη συλλογή Συμπεριφορές της παρουσίας κεντρικού υπολογιστή υπηρεσίας.