YARP Docsv2.3
Τεκμηρίωση/Κίνηση & αξιοπιστία/Συνάφεια συνεδρίας

Συνάφεια συνεδρίας

Η συνάφεια συνεδρίας είναι ένας μηχανισμός για τη δέσμευση (affinitization) μιας αιτιωδώς συσχετισμένης ακολουθίας αιτημάτων προς τον

Έννοια

Η συνάφεια συνεδρίας είναι ένας μηχανισμός για τη δέσμευση (affinitization) μιας αιτιωδώς συσχετισμένης ακολουθίας αιτημάτων προς τον προορισμό που χειρίστηκε το πρώτο αίτημα, όταν το φορτίο κατανέμεται μεταξύ πολλών προορισμών. Είναι χρήσιμη σε σενάρια όπου τα περισσότερα αιτήματα μιας ακολουθίας εργάζονται με τα ίδια δεδομένα και το κόστος πρόσβασης στα δεδομένα διαφέρει ανάλογα με τον κόμβο (προορισμό) που χειρίζεται τα αιτήματα. Το πιο συνηθισμένο παράδειγμα είναι μια προσωρινή μνήμη (cache), π.χ. στη μνήμη (in-memory), όπου το πρώτο αίτημα ανακτά δεδομένα από έναν πιο αργό μόνιμο χώρο αποθήκευσης σε μια γρήγορη τοπική cache, ενώ τα υπόλοιπα αιτήματα εργάζονται μόνο με τα δεδομένα της cache, αυξάνοντας έτσι τον ρυθμό απόδοσης.

Διαμόρφωση

Καταχώριση υπηρεσιών και ενδιάμεσου λογισμικού

Οι υπηρεσίες συνάφειας συνεδρίας καταχωρίζονται αυτόματα στο container DI από την AddReverseProxy(). Το ενδιάμεσο λογισμικό UseSessionAffinity() περιλαμβάνεται από προεπιλογή στη χωρίς παραμέτρους μέθοδο MapReverseProxy. Αν προσαρμόζετε το proxy pipeline εσείς οι ίδιοι, τοποθετήστε αυτό πρώτα ως ενδιάμεσο λογισμικό, πριν από την προσθήκη της UseLoadBalancing().

Παράδειγμα:

C#   app.MapReverseProxy(proxyPipeline =>
   {
          proxyPipeline.UseSessionAffinity();
          proxyPipeline.UseLoadBalancing();
   });
Note Some session affinity implementations depend on Data Protection, which will require
additional configuration for scenarios like multiple proxy instances. See Key Protection for
details.

Διαμόρφωση cluster

Η συνάφεια συνεδρίας διαμορφώνεται ανά cluster, σύμφωνα με το ακόλουθο σχήμα διαμόρφωσης.

JSON"ReverseProxy": {
   "Clusters": {
      "<cluster-name>": {
         "SessionAffinity": {
             "Enabled": "(true|false)", // defaults to 'false'
             "Policy": "(HashCookie|ArrCookie|Cookie|CustomHeader)", // defaults to
'HashCookie'
             "FailurePolicy": "(Redistribute|Return503Error)", // defaults to
'Redistribute'
             "AffinityKeyName": "Key1",
             "Cookie": {
                "Domain": "localhost",
                "Expiration": "03:00:00",
                "HttpOnly": true,
                "IsEssential": true,
                "MaxAge": "1.00:00:00",
                "Path": "mypath",
                "SameSite": "Strict",
                "SecurePolicy": "Always"
             }
         }
      }
   }
}

Οι ιδιότητες για τη διαμόρφωση του cookie που χρησιμοποιείται με τις πολιτικές HashCookie, ArrCookie και Cookie μπορούν να διαμορφωθούν χρησιμοποιώντας το SessionAffinityCookieConfig. Οι ιδιότητες αυτές μπορούν να οριστούν ως διαμόρφωση JSON, όπως φαίνεται παραπάνω, ή σε κώδικα, όπως φαίνεται παρακάτω:

C#new ClusterConfig
{
      ClusterId = "cluster1",
      SessionAffinity = new SessionAffinityConfig
      {
             Enabled = true,
             FailurePolicy = "Return503Error",
             Policy = "HashCookie",
             AffinityKeyName = "Key1",
             Cookie = new SessionAffinityCookieConfig
             {
                   Domain = "mydomain",
                   Expiration = TimeSpan.FromHours(3),
                   HttpOnly = true,
                   IsEssential = true,
                   MaxAge = TimeSpan.FromDays(1),
                      Path = "mypath",
                      SameSite = Microsoft.AspNetCore.Http.SameSiteMode.Strict,
                      SecurePolicy =
Microsoft.AspNetCore.Http.CookieSecurePolicy.SameAsRequest
                   }
   }
}

Κλειδί συνάφειας

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

Ο τρέχων σχεδιασμός δεν απαιτεί το κλειδί να προσδιορίζει μοναδικά έναν μόνο δεσμευμένο προορισμό. Επιτρέπεται η καθιέρωση συνάφειας προς μια ομάδα προορισμών. Σε αυτή την περίπτωση, ο ακριβής προορισμός που θα χειριστεί το δεδομένο αίτημα θα καθοριστεί από τον load balancer.

Καθιέρωση νέας συνάφειας ή επίλυση της υπάρχουσας

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

  1. Το αίτημα δεν περιέχει κλειδί. Η επίλυση παραλείπεται και θα καθιερωθεί μια νέα συνάφεια προς τον προορισμό που επιλέγει ο load balancer.

  2. Βρίσκεται κλειδί συνάφειας στο αίτημα και είναι έγκυρο. Ο μηχανισμός συνάφειας προσπαθεί να βρει όλους τους υγιείς προορισμούς που ταιριάζουν με το κλειδί, και αν βρει κάποιους, περνά το αίτημα παρακάτω στο pipeline. Αν βρεθούν πολλαπλοί ταιριαστοί προορισμοί, καλείται ο load balancer για να επιλέξει τον μοναδικό στοχευόμενο προορισμό. Αν βρεθεί μόνο ένας ταιριαστός προορισμός, ο load balancer δεν κάνει τίποτα.

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

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

παραδοθεί στον client, είναι ευθύνη του client να επισυνάπτει το κλειδί σε όλα τα επόμενα αιτήματα στην

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

επιλύει την υπάρχουσα συνάφεια, αλλά το κλειδί συνάφειας δεν επισυνάπτεται ξανά στην απόκριση. Έτσι,

μόνο η πρώτη απόκριση φέρει το κλειδί συνάφειας.

Υπάρχουν τέσσερις ενσωματωμένες πολιτικές συνάφειας που μορφοποιούν και αποθηκεύουν το κλειδί με διαφορετικό τρόπο στα αιτήματα και τις αποκρίσεις. Η προεπιλεγμένη πολιτική είναι η HashCookie.

Οι πολιτικές HashCookie, ArrCookie και Cookie αποθηκεύουν το κλειδί ως cookie, hashed ή κρυπτογραφημένο αντίστοιχα, δείτε την Προστασία κλειδιού παρακάτω. Το κλειδί του αιτήματος θα παραδίδεται ως cookie με το διαμορφωμένο όνομα, και το ίδιο cookie ορίζεται με την κεφαλίδα Set-Cookie στην πρώτη απόκριση μιας δεσμευμένης ακολουθίας. Το όνομα του cookie πρέπει να οριστεί ρητά μέσω του SessionAffinityConfig.AffinityKeyName. Άλλες ιδιότητες του cookie μπορούν να διαμορφωθούν μέσω του SessionAffinityCookieConfig. Η CustomHeader αποθηκεύει το κλειδί ως κρυπτογραφημένη κεφαλίδα. Αναμένει το κλειδί συνάφειας να παραδίδεται σε μια προσαρμοσμένη κεφαλίδα με το διαμορφωμένο όνομα, και ορίζει την ίδια κεφαλίδα στην πρώτη απόκριση μιας δεσμευμένης ακολουθίας. Το όνομα της κεφαλίδας πρέπει να οριστεί μέσω του SessionAffinityConfig.AffinityKeyName.

Σημείωση

Το AffinityKeyName πρέπει να είναι μοναδικό σε όλα τα clusters με ενεργοποιημένη συνάφεια συνεδρίας, για να αποφεύγονται συγκρούσεις.

Προστασία κλειδιού

Η πολιτική HashCookie χρησιμοποιεί το hash XxHash64 για να παράγει μια γρήγορη, συμπαγή και συγκαλυμμένη μορφή εξόδου για την τιμή του cookie.

Η πολιτική ArrCookie χρησιμοποιεί το hash SHA-256 για να παράγει μια συγκαλυμμένη έξοδο για την τιμή του cookie, η οποία ταιριάζει με τη μορφή του cookie συνάφειας ARR του IIS. Το ARR χρησιμοποιεί το όνομα host του προορισμού ως τιμή εισόδου, οπότε τα id προορισμού του YARP θα πρέπει να διαμορφωθούν ώστε να ταιριάζουν, αν χρησιμοποιούνται σε συνδυασμό με το ARR.

Οι πολιτικές HashCookie και ArrCookie δεν παρέχουν ισχυρή προστασία απορρήτου, και ευαίσθητα δεδομένα δεν θα πρέπει να περιλαμβάνονται στα id προορισμού. Αυτές οι πολιτικές επίσης δεν αποκρύπτουν τον συνολικό αριθμό μοναδικών προορισμών πίσω από τον διακομιστή μεσολάβησης, και δεν θα πρέπει να χρησιμοποιούνται αν αυτό αποτελεί ζήτημα.

Οι πολιτικές Cookie και CustomHeader κρυπτογραφούν το κλειδί χρησιμοποιώντας το Data Protection. Αυτό παρέχει ισχυρή προστασία απορρήτου για το κλειδί, αλλά απαιτεί πρόσθετη διαμόρφωση όταν χρησιμοποιείται περισσότερο από ένα στιγμιότυπο διακομιστή μεσολάβησης.

Πολιτική αποτυχίας συνάφειας

Αν το κλειδί συνάφειας δεν μπορεί να αποκωδικοποιηθεί ή δεν βρεθεί υγιής προορισμός, αυτό θεωρείται

αποτυχία και καλείται μια πολιτική αποτυχίας συνάφειας για να τη χειριστεί. Η πολιτική έχει πλήρη πρόσβαση στο

HttpContext και μπορεί να στείλει απόκριση στον client από μόνη της. Επιστρέφει μια boolean τιμή που υποδεικνύει

αν η επεξεργασία του αιτήματος μπορεί να συνεχιστεί παρακάτω στο pipeline ή πρέπει να τερματιστεί.

Υπάρχουν δύο ενσωματωμένες πολιτικές αποτυχίας. Η προεπιλεγμένη είναι η Redistribute.

  1. Redistribute - προσπαθεί να καθιερώσει νέα συνάφεια προς έναν από τους διαθέσιμους υγιείς προορισμούς, παρακάμπτοντας το βήμα αναζήτησης συνάφειας και περνώντας όλους τους υγιείς προορισμούς στον load balancer, με τον ίδιο τρόπο που γίνεται για ένα αίτημα χωρίς καμία συνάφεια. Η επεξεργασία του αιτήματος συνεχίζεται. Αυτό υλοποιείται από την RedistributeAffinityFailurePolicy.

  2. Return503Error - στέλνει μια απόκριση 503 πίσω στον client και η επεξεργασία του αιτήματος τερματίζεται. Αυτό υλοποιείται από την Return503ErrorAffinityFailurePolicy.

Pipeline αιτήματος

Οι μηχανισμοί συνάφειας συνεδρίας υλοποιούνται από τις υπηρεσίες (που αναφέρθηκαν παραπάνω) και το ακόλουθο ζεύγος ενδιάμεσου λογισμικού:

  1. SessionAffinityMiddleware - συντονίζει τη διαδικασία επίλυσης συνάφειας του αιτήματος. Πρώτα, καλεί μια πολιτική που καθορίζεται για το δεδομένο cluster στην ιδιότητα ClusterConfig.SessionAffinity.Policy. Στη συνέχεια, ελέγχει την κατάσταση επίλυσης συνάφειας που επιστρέφει η πολιτική, και καλεί μια πολιτική χειρισμού αποτυχίας που ορίζεται στο ClusterConfig.SessionAffinity.FailurePolicy σε περίπτωση αποτυχιών. Πρέπει να προστεθεί στο pipeline πριν από τον load balancer.

  2. AffinitizeTransform - ορίζει το κλειδί στην απόκριση, αν καθιερώθηκε νέα συνάφεια για το αίτημα. Διαφορετικά, αν το αίτημα ακολουθεί μια υπάρχουσα συνάφεια, δεν κάνει τίποτα. Αυτό προστίθεται αυτόματα ως μετασχηματισμός απόκρισης.

Σημείωση

Ο συγγραφέας δημιούργησε αυτό το άρθρο με τη βοήθεια AI. Μάθετε περισσότερα

Προσαρμογή από Microsoft Learn , με άδεια CC BY 4.0 .