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

Αρχιτεκτονικές εξισορρόπησης φορτίου διακομιστή, Μέρος 1: Εξισορρόπηση φορτίου σε επίπεδο μεταφοράς

Οι ομάδες διακομιστών επιτυγχάνουν υψηλή επεκτασιμότητα και υψηλή διαθεσιμότητα μέσω εξισορρόπησης φορτίου διακομιστή, μια τεχνική που κάνει το σύμπλεγμα διακομιστών να εμφανίζεται στους πελάτες ως μεμονωμένος διακομιστής. Σε αυτό το άρθρο δύο μερών, ο Gregor Roth διερευνά αρχιτεκτονικές εξισορρόπησης φορτίου διακομιστή, με έμφαση στις λύσεις ανοιχτού κώδικα. Το μέρος 1 καλύπτει τα βασικά στοιχεία εξισορρόπησης φορτίου διακομιστή και συζητά τα πλεονεκτήματα και τα μειονεκτήματα της εξισορρόπησης φορτίου διακομιστή σε επίπεδο μεταφοράς. Το μέρος 2 καλύπτει αρχιτεκτονικές εξισορρόπησης φορτίου διακομιστή σε επίπεδο εφαρμογής, οι οποίες αντιμετωπίζουν ορισμένους από τους περιορισμούς των αρχιτεκτονικών που συζητούνται στο Μέρος 1.

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

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

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

Ένα πιο δύσκολο πρόβλημα προκύπτει όταν τα στοιχεία της εφαρμογής είναι stateful. Για παράδειγμα, εάν το στοιχείο εφαρμογής διατηρεί δεδομένα καλαθιού αγορών, ένα εισερχόμενο αίτημα πρέπει να δρομολογηθεί σε μια παρουσία στοιχείου εφαρμογής που περιέχει τα δεδομένα του καλαθιού αγορών του αιτούντος. Αργότερα σε αυτό το άρθρο, θα συζητήσω πώς να χειριστώ τέτοια δεδομένα περιόδου σύνδεσης εφαρμογής σε κατανεμημένο περιβάλλον. Ωστόσο, για να μειωθεί η πολυπλοκότητα, τα περισσότερα επιτυχημένα συστήματα εφαρμογών που βασίζονται στο Διαδίκτυο προσπαθούν να αποφεύγουν τα συστατικά στοιχεία της εφαρμογής όποτε είναι δυνατόν.

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

Διαθεσιμότητα και επεκτασιμότητα

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

Πως λειτουργεί αυτό? Σε μια ευρέως χρησιμοποιούμενη αρχιτεκτονική εξισορρόπησης φορτίου διακομιστή, το εισερχόμενο αίτημα απευθύνεται σε έναν ειδικό εξισορροπητή φόρτωσης διακομιστή που είναι διαφανής στον πελάτη. Με βάση παραμέτρους όπως διαθεσιμότητα ή τρέχον φορτίο διακομιστή, ο εξισορροπητής φορτίου αποφασίζει ποιος διακομιστής θα χειριστεί το αίτημα και θα το προωθήσει στον επιλεγμένο διακομιστή. Για να παράσχει στον αλγόριθμο εξισορρόπησης φορτίου τα απαιτούμενα δεδομένα εισόδου, ο εξισορροπητής φορτίου ανακτά επίσης πληροφορίες σχετικά με την υγεία και τη φόρτωση των διακομιστών για να επιβεβαιώσει ότι μπορούν να ανταποκριθούν στην κίνηση. Το σχήμα 1 απεικονίζει αυτήν την κλασική αρχιτεκτονική εξισορρόπησης φορτίου.

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

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

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

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

Τεχνικές εξισορρόπησης φορτίου διακομιστή

Γενικά, οι λύσεις εξισορρόπησης φορτίου διακομιστή είναι δύο βασικών τύπων:

  • Επίπεδο μεταφορών εξισορρόπηση φορτίου - όπως η προσέγγιση που βασίζεται σε DNS ή το επίπεδο εξισορρόπησης φορτίου σε επίπεδο TCP / IP - ενεργεί ανεξάρτητα από το ωφέλιμο φορτίο της εφαρμογής.
  • Επίπεδο εφαρμογής load balancing χρησιμοποιεί το payload της εφαρμογής για να λαμβάνει αποφάσεις εξισορρόπησης φορτίου.

Οι λύσεις εξισορρόπησης φορτίου μπορούν να ταξινομηθούν περαιτέρω σε εξισορροπητές φορτίων βάσει λογισμικού και εξισορροπητές φορτίου βάσει υλικού. Οι εξισορροπητές φόρτωσης με βάση το υλικό είναι εξειδικευμένα κιβώτια υλικού που περιλαμβάνουν ολοκληρωμένα κυκλώματα (ASIC) ειδικά προσαρμοσμένα για συγκεκριμένη χρήση. Τα ASIC επιτρέπουν την προώθηση υψηλής ταχύτητας της κίνησης δικτύου χωρίς την επιβάρυνση ενός λειτουργικού συστήματος γενικής χρήσης. Οι εξισορροπητές φορτίου με βάση το υλικό χρησιμοποιούνται συχνά για εξισορρόπηση φορτίου σε επίπεδο μεταφοράς. Γενικά, οι εξισορροπητές φόρτωσης με βάση το υλικό είναι γρηγορότεροι από τις λύσεις που βασίζονται σε λογισμικό. Το μειονέκτημά τους είναι το κόστος τους.

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

Εξισορρόπηση φορτίου βάσει DNS

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

Η προσέγγιση που βασίζεται σε DNS βασίζεται στο γεγονός ότι το DNS επιτρέπει την εκχώρηση πολλαπλών διευθύνσεων IP (πραγματικοί διακομιστές) σε ένα όνομα κεντρικού υπολογιστή, όπως φαίνεται στο παράδειγμα αναζήτησης DNS στην καταχώριση 1.

Λίστα 1. Παράδειγμα αναζήτησης DNS

> nslookup amazon.com Διακομιστής: ns.box Διεύθυνση: 192.168.1.1 Όνομα: amazon.com Διευθύνσεις: 72.21.203.1, 72.21.210.11, 72.21.206.5

Εάν ο διακομιστής DNS εφαρμόζει μια προσέγγιση round-robin, η σειρά των διευθύνσεων IP για έναν δεδομένο κεντρικό υπολογιστή αλλάζει μετά από κάθε απόκριση DNS. Συνήθως οι πελάτες όπως τα προγράμματα περιήγησης προσπαθούν να συνδεθούν στην πρώτη διεύθυνση που επιστρέφεται από ένα ερώτημα DNS. Το αποτέλεσμα είναι ότι οι απαντήσεις σε πολλούς πελάτες κατανέμονται μεταξύ των διακομιστών. Σε αντίθεση με την αρχιτεκτονική εξισορρόπησης φορτίου διακομιστή στο Σχήμα 1, δεν απαιτείται κόμβος υλικού ενδιάμεσου εξισορροπητικού φορτίου.

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

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

Εξισορρόπηση φορτίου διακομιστή TCP / IP

Οι εξισορροπητές φόρτωσης διακομιστή TCP / IP λειτουργούν σε εναλλαγή επιπέδου χαμηλού επιπέδου. Ένας δημοφιλής εξισορροπητής φόρτωσης διακομιστή χαμηλού επιπέδου που βασίζεται σε λογισμικό είναι ο Linux Virtual Server (LVS). Οι πραγματικοί διακομιστές εμφανίζονται στον έξω κόσμο ως ένας μοναδικός "εικονικός" διακομιστής. Οι εισερχόμενες αιτήσεις σε σύνδεση TCP προωθούνται στους πραγματικούς διακομιστές από το load balancer, ο οποίος εκτελεί έναν πυρήνα Linux που έχει διορθωθεί για να συμπεριλάβει τον κώδικα IP Virtual Server (IPVS).

Για να διασφαλιστεί η υψηλή διαθεσιμότητα, στις περισσότερες περιπτώσεις έχει δημιουργηθεί ένα ζεύγος κόμβων εξισορρόπησης φορτίου, με έναν κόμβο εξισορρόπησης φορτίου σε παθητική λειτουργία. Εάν αποτύχει ένας εξισορροπητής φορτίου, το πρόγραμμα καρδιακού παλμού που εκτελείται και στους δύο εξισορροπητές φορτίου ενεργοποιεί τον κόμβο παθητικού εξισορροπητικού φορτίου και ξεκινά την ανάληψη της εικονικής διεύθυνσης IP (VIP). Ενώ ο παλμός της καρδιάς είναι υπεύθυνος για τη διαχείριση του failover μεταξύ των εξισορροπητών φορτίου, χρησιμοποιούνται απλά σενάρια αποστολής / αναμονής για την παρακολούθηση της υγείας των πραγματικών διακομιστών.

Η διαφάνεια στον πελάτη επιτυγχάνεται χρησιμοποιώντας ένα VIP που έχει αντιστοιχιστεί στον εξισορροπητή φόρτωσης. Εάν ο πελάτης εκδώσει ένα αίτημα, πρώτα το όνομα κεντρικού υπολογιστή που ζητήθηκε μεταφράζεται στο VIP. Όταν λαμβάνει το πακέτο αιτήσεων, ο αντισταθμιστής φορτίου αποφασίζει ποιος πραγματικός διακομιστής πρέπει να χειριστεί το πακέτο αιτήσεων. Η διεύθυνση IP προορισμού του πακέτου αιτήσεων ξαναγράφεται στην πραγματική IP (RIP) του πραγματικού διακομιστή. Το LVS υποστηρίζει διάφορους αλγόριθμους προγραμματισμού για τη διανομή αιτημάτων στους πραγματικούς διακομιστές. Συχνά έχει ρυθμιστεί για χρήση προγραμματισμού round-robin, παρόμοια με την εξισορρόπηση φορτίου που βασίζεται σε DNS. Με το LVS, η απόφαση εξισορρόπησης φορτίου λαμβάνεται σε επίπεδο TCP (Επίπεδο 4 του Μοντέλου Αναφοράς OSI).

Μετά τη λήψη του πακέτου αιτήσεων, ο πραγματικός διακομιστής το χειρίζεται και επιστρέφει το πακέτο απόκρισης. Για να αναγκάσει το πακέτο απόκρισης να επιστραφεί μέσω του εξισορροπητή φόρτωσης, ο πραγματικός διακομιστής χρησιμοποιεί το VIP ως προεπιλεγμένη διαδρομή απόκρισης. Εάν ο αντισταθμιστής φορτίου λάβει το πακέτο απόκρισης, η πηγή IP του πακέτου απόκρισης ξαναγράφεται με το VIP (OSI Model Layer 3). Αυτή η λειτουργία δρομολόγησης LVS ονομάζεται δρομολόγηση μετάφρασης διευθύνσεων δικτύου (NAT). Το σχήμα 2 δείχνει μια εφαρμογή LVS που χρησιμοποιεί δρομολόγηση NAT.

Το LVS υποστηρίζει επίσης άλλους τρόπους δρομολόγησης όπως Άμεση επιστροφή διακομιστή. Σε αυτήν την περίπτωση το πακέτο απόκρισης αποστέλλεται απευθείας στον πελάτη από τον πραγματικό διακομιστή. Για να γίνει αυτό, το VIP πρέπει να εκχωρηθεί και σε όλους τους πραγματικούς διακομιστές. Είναι σημαντικό να κάνετε το VIP του διακομιστή ανεπίλυτο στο δίκτυο. Διαφορετικά, ο εξισορροπητής φορτίου γίνεται απρόσιτος. Εάν το πρόγραμμα εξισορρόπησης φορτίου λάβει ένα πακέτο αιτημάτων, η διεύθυνση MAC (OSI Model Layer 2) του αιτήματος ξαναγράφεται αντί της διεύθυνσης IP. Ο πραγματικός διακομιστής λαμβάνει το πακέτο αιτήσεων και το επεξεργάζεται. Με βάση τη διεύθυνση IP πηγής, το πακέτο απόκρισης αποστέλλεται απευθείας στον πελάτη, παρακάμπτοντας τον εξισορροπητή φόρτωσης. Για την κυκλοφορία στο Διαδίκτυο, αυτή η προσέγγιση μπορεί να μειώσει δραστικά τον φόρτο εργασίας του εξισορροπητή. Συνήθως, μεταφέρονται πολύ περισσότερα πακέτα απόκρισης από τα πακέτα αιτήσεων. Για παράδειγμα, εάν ζητήσετε μια ιστοσελίδα, αποστέλλεται συχνά μόνο ένα πακέτο IP. Εάν ζητηθεί μεγαλύτερη ιστοσελίδα, απαιτούνται αρκετά πακέτα IP απόκρισης για τη μεταφορά της σελίδας που ζητήθηκε.

Προσωρινή αποθήκευση

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

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

Η λίστα 2 χρησιμοποιεί spymemcached, ένα σε μνήμη πελάτη γραμμένο σε Java, για κρυφή μνήμη HttpResponse μηνύματα σε πολλά μηχανήματα. ο spymemcached Η βιβλιοθήκη εφαρμόζει την απαιτούμενη λογική πελάτη που μόλις περιέγραψα.

Λίστα 2. Προσωρινή μνήμη HttpResponse με βάση τη μνήμη

$config[zx-auto] not found$config[zx-overlay] not found