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

Χρησιμοποιήστε το Memcached για Java Enterprise Performance, Μέρος 1: Αρχιτεκτονική και εγκατάσταση

Αναπτύχθηκε από την Danga Interactive για τη βελτίωση της απόδοσης του ιστότοπου στο LiveJournal.com, η κατανεμημένη αρχιτεκτονική της Memcached υποστηρίζει σήμερα την εκθετική επεκτασιμότητα κοινωνικών εφαρμογών ιστού όπως το Twitter, το Facebook και η Wikipedia. Σε αυτό το σεμινάριο δύο μερών, η Sunil Patil παρουσιάζει την κατανεμημένη κατακερματισμένη αρχιτεκτονική της Memcached και σας ξεκινά να το χρησιμοποιείτε για την προσωρινή αποθήκευση δεδομένων για τις δικές σας εφαρμογές Java που βασίζονται στη βάση δεδομένων.

Αυτό το σεμινάριο σας παρουσιάζει τη χρήση του Memcached για να βελτιώσετε την απόδοση των εφαρμογών Java Enterprise. Το πρώτο μισό ξεκινά με μια επισκόπηση των παραδοσιακών αρχιτεκτονικών προσωρινής αποθήκευσης Java σε σύγκριση με την αρχιτεκτονική του Memcached. Θα εγκαταστήσουμε επίσης το Memcached στο μηχάνημά σας και θα σας συστήσω τη ρύθμιση και τις εντολές για εργασία με το Memcached μέσω Telnet. Στο δεύτερο ημίχρονο θα αναπτύξουμε ένα πρόγραμμα πελάτη "Hello Memcached" στην Java, το οποίο θα χρησιμοποιήσουμε για να κοιτάξουμε κάτω από την κουκούλα ενός πελάτη spymemcached. Θα μάθετε επίσης τη χρήση του Memcached για τη μείωση του φορτίου στο διακομιστή βάσης δεδομένων και τη χρήση του για την προσωρινή αποθήκευση σήμανσης σελίδας που δημιουργείται δυναμικά. Τέλος, θα εξετάσουμε ορισμένες σύνθετες επιλογές για τη ρύθμιση παραμέτρων πελατών που έχουν αποθηκευτεί στο spymemcached.

Περισσότερα σχετικά με την προσωρινή αποθήκευση Java στο JavaWorld

  • Ανατρέξτε στην ενότητα "Αρχιτεκτονικές εξισορρόπησης φορτίου διακομιστή, Μέρος 1: Εξισορρόπηση φορτίου σε επίπεδο μεταφοράς" για μια πιο εμπεριστατωμένη συζήτηση της κατανεμημένης προσωρινής αποθήκευσης με το Memcached.
  • Ανατρέξτε επίσης στην ενότητα "Έργα Java ανοιχτού κώδικα: Java Caching System" για να μάθετε σχετικά με την παραδοσιακή προσωρινή αποθήκευση Java.

Επισκόπηση των αρχιτεκτονικών Memcached και Java caching

Τα πλαίσια προσωρινής αποθήκευσης Java όπως το EHCache και το OSCache είναι ουσιαστικά HashMap αντικείμενα στον κωδικό εφαρμογής σας. Κάθε φορά που προσθέτετε ένα νέο αντικείμενο στην προσωρινή μνήμη, θα αποθηκεύεται στη μνήμη της εφαρμογής σας. Αυτή η στρατηγική λειτουργεί καλά για την αποθήκευση μικρών ποσοτήτων δεδομένων, αλλά δεν λειτουργεί για την προσωρινή αποθήκευση περισσότερων από λίγα gigabyte (GB). Οι σχεδιαστές του διακομιστή Memcached υιοθέτησαν μια κατανεμημένη αρχιτεκτονική προσέγγιση, η οποία επιτρέπει την επεκτασιμότητα του συστήματος. Ως αποτέλεσμα, μπορείτε να χρησιμοποιήσετε το Memcached για να αποθηκεύσετε κρυφή μνήμη σε τεράστιο όγκο δεδομένων.

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

Εάν έχετε κάποια εμπειρία εργασίας σε εφαρμογές Java Java EE, οι πιθανότητες είναι ότι έχετε χρησιμοποιήσει προηγουμένως ένα πλαίσιο ανοιχτού κώδικα Java προσωρινής αποθήκευσης όπως το EHCache ή το OSCache. Μπορεί επίσης να έχετε χρησιμοποιήσει ένα εμπορικό πλαίσιο προσωρινής αποθήκευσης που αποστέλλεται ως μέρος του διακομιστή εφαρμογών σας, όπως το DynaCache (το οποίο αποστέλλεται με IBM WebSphere Application Server) ή το JBoss Cache (το οποίο αποστέλλεται με το JBoss AS). Πριν μπείτε στο πρακτικό μέρος της εκμάθησης αυτού του σεμιναρίου, είναι σημαντικό να κατανοήσετε πώς διαφέρει το Memcached από αυτά τα παραδοσιακά πλαίσια προσωρινής αποθήκευσης Java.

Χρησιμοποιώντας μια παραδοσιακή προσωρινή μνήμη Java

Η χρήση ενός παραδοσιακού πλαισίου προσωρινής αποθήκευσης Java είναι αρκετά εύκολη, ανεξάρτητα από το αν επιλέγετε μια ανοιχτή πηγή ή μια εμπορική επιλογή. Για ένα πλαίσιο ανοιχτού κώδικα όπως το EHCache ή το OSCache, θα πρέπει να κατεβάσετε τα δυαδικά αρχεία και να προσθέσετε τα απαραίτητα αρχεία JAR στο classpath της εφαρμογής σας. Ίσως χρειαστεί επίσης να δημιουργήσετε ένα αρχείο διαμόρφωσης, το οποίο θα χρησιμοποιούσατε για να διαμορφώσετε το μέγεθος της προσωρινής μνήμης, την εκφόρτωση δίσκου και ούτω καθεξής. Για ένα πλαίσιο προσωρινής αποθήκευσης που συνοδεύτηκε από έναν διακομιστή εφαρμογών, συνήθως δεν θα χρειαστεί να κάνετε λήψη επιπλέον JAR, επειδή θα ομαδοποιούνται με το λογισμικό.

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

Εάν ο διακομιστής εφαρμογών σας εκτελούσε σε πολλούς κόμβους, τότε ίσως θελήσετε επίσης υποστήριξη για κατανεμημένη προσωρινή αποθήκευση. Σε ένα σύστημα κατανεμημένης προσωρινής μνήμης, όταν προσθέτετε ένα αντικείμενο στην προσωρινή μνήμη στο AppServer1, αυτό το αντικείμενο είναι επίσης διαθέσιμο στα AppServer2 και AppServer3. Παραδοσιακή χρήση Java cache αναπαραγωγή για κατανεμημένη προσωρινή αποθήκευση, που σημαίνει ότι όταν προσθέτετε μια καταχώριση προσωρινής μνήμης στο AppServer1, αναπαράγεται αυτόματα στους άλλους διακομιστές εφαρμογών του συστήματός σας. Ως αποτέλεσμα, η καταχώρηση θα είναι διαθέσιμη σε όλους τους κόμβους σας.

Χρησιμοποιώντας το Memcached

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

Στη συνέχεια, θα κάνετε λήψη ενός προγράμματος-πελάτη Java για Memcached και θα προσθέσετε τα JAR πελάτη στην εφαρμογή σας. Μετά από αυτό, μπορείτε να δημιουργήσετε ένα αντικείμενο πελάτη Memcached και να αρχίσετε να καλείτε τη μέθοδο του για να λάβετε και να ορίσετε καταχωρήσεις cache. Όταν προσθέτετε ένα αντικείμενο στην προσωρινή μνήμη, ο πελάτης Memcached θα πάρει αυτό το αντικείμενο, θα το σειριοποιήσει και θα στείλει έναν πίνακα byte στο διακομιστή Memcached για αποθήκευση. Σε αυτό το σημείο, το προσωρινά αποθηκευμένο αντικείμενο ενδέχεται να συλλέγεται σκουπίδια από το JVM όπου εκτελείται η εφαρμογή σας.

Όταν χρειάζεστε αυτό το προσωρινά αποθηκευμένο αντικείμενο, μπορείτε να καλέσετε τον πελάτη Memcached παίρνω() μέθοδος. Ο πελάτης θα πάρει το παίρνω αίτημα, σειριοποίηση και αποστολή του στο διακομιστή Memcached. Ο διακομιστής Memcached θα χρησιμοποιήσει το αίτημα για αναζήτηση του αντικειμένου από την προσωρινή μνήμη. Μόλις έχει το αντικείμενο, θα επιστρέψει τον πίνακα byte στον πελάτη Memcached. Στη συνέχεια, το αντικείμενο πελάτη Memcached θα πάρει τον πίνακα byte και θα τον αποεπιβάλει για να δημιουργήσει το αντικείμενο και να το επιστρέψει στην εφαρμογή σας.

Ακόμα κι αν η εφαρμογή σας εκτελείται σε περισσότερους από έναν διακομιστές εφαρμογών, όλοι μπορούν να οδηγούν στον ίδιο διακομιστή Memcached και να τον χρησιμοποιούν για λήψη και ρύθμιση καταχωρίσεων προσωρινής μνήμης. Εάν έχετε περισσότερους από έναν διακομιστές Memcached, οι διακομιστές δεν θα γνωρίζουν ο ένας τον άλλον. Αντ 'αυτού, θα ρυθμίσετε τις παραμέτρους του προγράμματος-πελάτη Memcached έτσι ώστε να γνωρίζει όλους τους διαθέσιμους διακομιστές Memcached. Για παράδειγμα, εάν η εφαρμογή σας δημιουργεί ένα αντικείμενο Java στο AppServer1 και καλεί το σειρά() μέθοδος Memcached, τότε ο πελάτης Memcached θα καταλάβει σε ποιον διακομιστή Memcached πηγαίνει στην καταχώριση. Στη συνέχεια, θα αρχίσει να επικοινωνεί μόνο με αυτόν τον διακομιστή Memcached. Ομοίως, όταν ο κώδικάς σας στο AppServer2 ή στο AppServer3 προσπαθεί παίρνω μια καταχώριση, ο πελάτης Memcached θα καταλάβει πρώτα σε ποιον διακομιστή είναι αποθηκευμένη η καταχώριση και, στη συνέχεια, επικοινωνεί μόνο με αυτόν τον διακομιστή.

Λογική πελάτη με μνήμη

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

Εγκατάσταση Memcached

Το Memcached εκτελείται σε Unix, Linux, Windows και MacOSX. Μπορείτε είτε να κάνετε λήψη της πηγής Memcached και να την μεταγλωττίσετε είτε να κάνετε λήψη των δυαδικών αρχείων που έχουν συνταχθεί από κάποιον άλλο και να τα χρησιμοποιήσετε για να εγκαταστήσετε το Memcached. Εδώ θα ακολουθήσω τη διαδικασία λήψης των δυαδικών αρχείων για την πλατφόρμα της επιλογής σας. ανατρέξτε στην ενότητα Πόροι εάν προτιμάτε να μεταγλωττίσετε από την πηγή.

Οι ακόλουθες οδηγίες εγκατάστασης αφορούν έναν υπολογιστή 32-bit των Windows XP. Δείτε πόρους για οδηγίες εγκατάστασης για άλλες πλατφόρμες όπως το Linux. Σημειώστε επίσης ότι το δείγμα κώδικα για αυτό το άρθρο αναπτύχθηκε σε έναν υπολογιστή Windows XP 32-bit, αν και θα πρέπει να λειτουργεί σε οποιαδήποτε άλλη πλατφόρμα.

  1. Ο κώδικας Jellycan έχει μια τροποποιημένη έκδοση του Memcached που είναι εύκολο και αποτελεσματικό στην εργασία. Ξεκινήστε εδώ κατεβάζοντας το αρχείο δυαδικού ZIP win32
  2. Επεκτείνουν Memcached--win32-bin.zip στον σκληρό σας δίσκο. Σημειώστε ότι το μόνο που περιέχει είναι memcached.exe. Εκτελέστε αυτό το αρχείο για να ξεκινήσετε τον διακομιστή Memcached.
  3. Τώρα εκτελέστε memcached.exe -d εγκατάσταση για να εγγραφείτε memcached.exe ως υπηρεσία. Θα μπορείτε να χρησιμοποιήσετε την Κονσόλα υπηρεσιών για να ξεκινήσετε και να σταματήσετε τον διακομιστή Memcached.

Έναρξη / διακοπή CL

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

Όταν εκτελείτε το memcached.exe χωρίς επιλογές γραμμής εντολών, από προεπιλογή ο διακομιστής Memcached θα ξεκινήσει στη θύρα 11211 με μνήμη 64 MB. Σε ορισμένες περιπτώσεις, ίσως θέλετε να έχετε πιο λεπτομερή έλεγχο της διαμόρφωσης. Για παράδειγμα, ας πούμε ότι η θύρα 11211 χρησιμοποιείται από κάποια άλλη διαδικασία στο μηχάνημά σας και θέλετε ο διακομιστής Memcached να χρησιμοποιεί τη θύρα 12000. ή εάν ξεκινήσατε τον διακομιστή Memcached σε περιβάλλον QA ή παραγωγής, θα θέλατε να του δώσετε περισσότερη μνήμη από τα προεπιλεγμένα 64 MB. Σε αυτές τις περιπτώσεις θα μπορούσατε να χρησιμοποιήσετε επιλογές γραμμής εντολών για να προσαρμόσετε τη συμπεριφορά του διακομιστή. Εκτέλεση του memcache.exe - βοήθεια Η εντολή θα δώσει μια πλήρη λίστα επιλογών γραμμής εντολών όπως αυτές που φαίνονται στο Σχήμα 3.

Συνδεθείτε με Memcached μέσω Telnet

Μετά την εκκίνηση του διακομιστή Memcached, ακούει στη θύρα στην οποία έχετε εκχωρήσει. Ο πελάτης Memcached συνδέεται με τον διακομιστή είτε στη θύρα TCP είτε UDP, στέλνει εντολές και λαμβάνει απαντήσεις και τελικά κλείνει τη σύνδεση. (Δείτε πόρους για λεπτομέρειες σχετικά με το πρωτόκολλο που χρησιμοποιεί ο πελάτης για να επικοινωνήσει με τον διακομιστή.)

Μπορείτε να συνδεθείτε στον διακομιστή Memcached με διάφορους τρόπους. Εάν χρησιμοποιείτε πρόγραμμα-πελάτη Java, όπως θα κάνουμε στο δεύτερο μισό αυτού του σεμιναρίου, θα έχετε πρόσβαση σε ένα απλό API για αποθήκευση και λήψη αντικειμένων από την προσωρινή μνήμη. Εναλλακτικά, θα μπορούσατε να χρησιμοποιήσετε ένα πρόγραμμα-πελάτη Telnet για να συνδεθείτε απευθείας στον διακομιστή. Η γνώση του τρόπου χρήσης του προγράμματος-πελάτη Telnet για επικοινωνία με τον διακομιστή Memcached είναι σημαντική για τον εντοπισμό σφαλμάτων του προγράμματος-πελάτη Java, οπότε θα ξεκινήσουμε από εκεί.

Εντολές Telnet

Πρώτα θα πρέπει να χρησιμοποιήσετε τον πελάτη Telnet της επιλογής σας για να συνδεθείτε στον διακομιστή Memcached. Σε έναν υπολογιστή Windows XP, μπορείτε απλά να το εκτελέσετε telnet localhost 11211 υποθέτοντας ότι ο διακομιστής Memcached εκτελείται στον ίδιο υπολογιστή και ακούει στην προεπιλεγμένη θύρα 11211. Οι ακόλουθες εντολές είναι απαραίτητες για την εργασία με το Memcached μέσω Telnet:

  • σειρά προσθέτει ένα νέο στοιχείο στην προσωρινή μνήμη. Η κλήση είναι: Σειρά . Μπορείτε να πληκτρολογήσετε την πραγματική τιμή που πρέπει να αποθηκευτεί στην επόμενη γραμμή. Εάν δεν θέλετε να λήξει η καταχώριση προσωρινής μνήμης, εισαγάγετε 0 ως τιμή.
  • παίρνω επιστρέφει την τιμή του κλειδιού cache. Χρήση παίρνω για να πάρει την τιμή του όνομα κλειδιού.
  • Προσθήκη προσθέτει ένα νέο κλειδί μόνο εάν δεν υπάρχει ήδη. Για παράδειγμα: Προσθήκη
  • αντικαθιστώ θα αντικαταστήσει μια τιμή μόνο εάν το κλειδί υπάρχει. Για παράδειγμα: αντικαθιστώ
  • διαγράφω διαγράφει την καταχώριση προσωρινής μνήμης για το κλειδί. Μπορείτε να χρησιμοποιήσετε την κλήση διαγράφω για να διαγράψετε την τιμή του όνομα κλειδιού.

Το στιγμιότυπο οθόνης στο σχήμα 4 αντιπροσωπεύει ένα δείγμα αλληλεπίδρασης με τον διακομιστή Memcached μέσω Telnet. Όπως μπορείτε να δείτε, ο διακομιστής Memcached παρέχει ανατροφοδότηση σε κάθε εντολή, όπως ΑΠΟΘΗΚΕΥΜΕΝΟ, ΔΕΝ_ΑΠΟΘΗΚΕ, και ούτω καθεξής.

Συμπέρασμα στο Μέρος 1

Μέχρι στιγμής έχουμε συζητήσει εν συντομία τις διαφορές μεταξύ της κατανεμημένης αρχιτεκτονικής της Memcached και των πιο παραδοσιακών συστημάτων cache Java. Έχουμε επίσης δημιουργήσει μια εφαρμογή Memcached στο περιβάλλον ανάπτυξης και έχετε εξασκήσει τη σύνδεση στο Memcached μέσω Telnet. Στο επόμενο μέρος αυτού του σεμιναρίου θα χρησιμοποιήσουμε το πρόγραμμα-πελάτη Java spymemcached για να δημιουργήσουμε μια κατανεμημένη λύση προσωρινής αποθήκευσης για ένα δείγμα εφαρμογής Java. Στη διαδικασία, θα μάθετε περισσότερα για το Memcached και πώς μπορεί να βελτιώσει την απόδοση των εφαρμογών Java EE.

Ο Sunil Patil είναι ένας αρχιτέκτονας Java EE που εργάζεται για την Avnet Technology στο Σαν Φρανσίσκο της Καλιφόρνια. Είναι ο συγγραφέας του Πύλη Java 101 (SourceBeat, Απρίλιος 2007) και έχει γράψει πολλά άρθρα που εκδόθηκαν από την JavaWorld, την IBM developerWorks και την O'Reilly Media. Εκτός από το ότι είναι IBM Certified WebSphere Portal Server Application Developer και Administer, είναι πιστοποιημένος προγραμματιστής Java της Sun Microsystems, προγραμματιστής στοιχείων Web και προγραμματιστής επιχειρηματικών στοιχείων. Μπορείτε να δείτε το ιστολόγιο της Sunil στη διεύθυνση //www.webspherenotes.com.