Programmering

Brug Memcached til Java-virksomhedsydelse, del 1: Arkitektur og opsætning

Memcaches distribuerede arkitektur er i dag udviklet af Danga Interactive for at forbedre webstedsydelsen på LiveJournal.com og understøtter den eksponentielle skalerbarhed af sociale webapplikationer som Twitter, Facebook og Wikipedia. I denne tutorial i to dele introducerer Sunil Patil Memcached's distribuerede hashtable-arkitektur og får dig i gang med at bruge den til at cache data til dine egne databasedrevne Java-virksomhedsapplikationer.

Denne tutorial introducerer dig til at bruge Memcached til at forbedre ydeevnen for Java-virksomhedsapplikationer. Første halvdel starter med en oversigt over traditionelle Java-cachingarkitekturer sammenlignet med Memcaches arkitektur. Vi får også Memcached installeret på din maskine, og jeg introducerer dig til opsætningen og kommandoerne til at arbejde med Memcached via Telnet. I anden halvdel udvikler vi et "Hello Memcached" -klientprogram i Java, som vi bruger til at kigge under hætte på en spymemcached klient. Du lærer også om at bruge Memcached til at reducere belastningen på din databaseserver og bruge den til at cache dynamisk genereret sidemarkering. Endelig overvejer vi nogle avancerede muligheder for konfiguration af spymemcached-klienter.

Mere om Java-caching på JavaWorld

  • Se "Serverbelastningsbalanceringsarkitekturer, del 1: Belastningsafbalancering på transportniveau" for en mere detaljeret diskussion af distribueret caching med Memcached.
  • Se også "Open source Java-projekter: Java Caching System" for at lære om traditionel Java-caching.

Oversigt over Memcached og Java caching-arkitekturer

Java-caching-rammer som EHCache og OSCache er i det væsentlige HashMap objekter i din applikationskode. Hver gang du føjer et nyt objekt til cachen, gemmes det i din applikations hukommelse. Denne strategi fungerer fint til lagring af små mængder data, men den fungerer ikke til cache mere end få gigabyte (GB). Designerne af Memcached-serveren tog en distribueret arkitektonisk tilgang, der giver mulighed for system skalerbarhed. Som et resultat kan du bruge Memcached til at cache en enorm mængde data.

Arkitekturen i Memcached består af to stykker. Først er en Memcached-server, der kører i sin egen proces. Hvis du vil skalere din applikation, kan du installere og køre Memcached-serveren på yderligere maskiner. Forekomster af Memcached-serveren kender ikke hinanden. Memcached-klienten, det andet stykke af Memcached-systemet, gør kender til hver af serverne. Klienten er ansvarlig for at afhente serveren til hver cacheindgang og enten gemme eller hente cacheindgangen - en proces, jeg vil diskutere detaljeret senere i artiklen.

Hvis du har en vis erfaring med at arbejde på Java EE-webapplikationer, er chancerne for, at du tidligere har brugt en open source Java-caching-ramme som EHCache eller OSCache. Du har muligvis også brugt en kommerciel caching-ramme, der sendes som en del af din applikationsserver, såsom DynaCache (som leveres med IBM WebSphere Application Server) eller JBoss Cache (som leveres med JBoss AS). Før vi går ind i den praktiske indlæringsdel af denne vejledning, er det vigtigt at forstå, hvordan Memcached adskiller sig fra disse traditionelle Java-cacherammer.

Brug af en traditionel Java-cache

Brug af en traditionel Java-cacheramme er ret let, uanset om du vælger en open source eller kommerciel mulighed. For en open source-ramme som EHCache eller OSCache skal du downloade binærfiler og tilføje nødvendige JAR-filer til klassestien til din applikation. Du skal muligvis også oprette en konfigurationsfil, som du vil bruge til at konfigurere størrelsen på cachen, diskaflæsning osv. For en caching-ramme, der fulgte med en applikationsserver, behøver du typisk ikke downloade yderligere JAR'er, fordi de følger med softwaren.

Når du har tilføjet support til caching-rammen i din applikation, kan du begynde at bruge den ved at oprette en CacheManager objekt og få og indstille cache-poster i det. Under emhætten ville caching-rammen skabe CacheManager objekter i den samme JVM, hvor din applikation kørte. Hver gang du tilføjede en cache-post, blev objektet også føjet til en slags hashtable, der opretholdes af caching-rammen.

Hvis din applikationsserver kørte på flere noder, vil du muligvis også have support til distribueret caching. I et distribueret cache-system, når du tilføjer et objekt i cachen på AppServer1, er objektet også tilgængeligt på AppServer2 og AppServer3. Brug af traditionelle Java-cacher replikation til distribueret cache, hvilket betyder, at når du tilføjer en cache-post på AppServer1, replikeres den automatisk til de andre app-servere i dit system. Som et resultat vil posten være tilgængelig på alle dine noder.

Brug af Memcached

For at kunne bruge Memcached til cache skal du først downloade og installere Memcached-serveren til den valgte platform. Når du har installeret Memcached-serveren, vil den lytte på enten en TCP- eller UDP-port til cache-opkald.

Derefter downloader du en Java-klient til Memcached og tilføjer klient-JAR'erne til din applikation. Derefter kan du oprette et Memcached-klientobjekt og begynde at kalde dets metode for at hente og indstille cache-poster. Når du føjer et objekt til cachen, tager Memcached-klienten det objekt, serialiserer det og sender et byte-array til Memcached-serveren til lagring. På det tidspunkt kan det cachelagrede objekt muligvis indsamles skrald fra den JVM, hvor din applikation kører.

Når du har brug for det cachelagrede objekt, kan du ringe til Memcached-klientens få() metode. Klienten tager anmodning, serialiseres og sendes til Memcached-serveren. Memcached-serveren bruger anmodningen til at slå objektet op fra cachen. Når det har objektet, returnerer det byte-arrayet til Memcached-klienten. Memcached-klientobjektet tager derefter byte-arrayet og deserialiserer det for at oprette objektet og returnere det til din applikation.

Selvom din applikation kører på mere end en applikationsserver, kan alle pege på den samme Memcached-server og bruge den til at hente og indstille cache-poster. Hvis du har mere end en Memcached-server, ved serverne ikke hinanden. I stedet konfigurerer du din Memcached-klient, så den kender alle de tilgængelige Memcached-servere. For eksempel, hvis din applikation opretter et Java-objekt på AppServer1 og ringer til sæt() metode til Memcached, vil Memcached-klienten finde ud af, hvilken Memcached-server, posten går til. Derefter begynder det kun at kommunikere med den Memcached-server. Ligeledes når din kode i AppServer2 eller AppServer3 forsøger at en post, finder Memcached-klienten først ud af, hvilken server denne post er gemt på, og kommunikerer derefter kun med den server.

Memcached klientlogik

I sin standardkonfiguration bruger Memcached-klienten meget enkel logik til at vælge serveren til en get eller set-operation. Når du laver en få() eller sæt() opkald, klienten tager cache-nøglen og kalder dens hashCode () metode til at få et heltal som f.eks. 11. Det tager derefter antallet og dividerer det med antallet af tilgængelige Memcached-servere, siger to. Det tager derefter værdien af ​​resten, som er 1 i dette tilfælde. Cache-posten går til Memcached-server 1. Denne enkle algoritme sikrer, at Memcached-klienten på hver af dine applikationsservere altid vælger den samme server til en given cache-nøgle.

Installation af Memcached

Memcached kører på Unix, Linux, Windows og MacOSX. Du kan enten downloade Memcached-kilden og kompilere den, eller du kan downloade de binære filer, der er udarbejdet af en anden, og bruge dem til at installere Memcached. Her vil jeg gennemgå processen med at downloade binære filer til den platform, du vælger; se Ressourcer, hvis du foretrækker at kompilere fra kilde.

Følgende installationsinstruktioner gælder for en Windows XP 32-bit maskine. Se Ressourcer for installationsinstruktioner til andre platforme såsom Linux. Bemærk også, at prøvekoden til denne artikel blev udviklet på en Windows XP 32-bit maskine, selvom den skulle fungere på enhver anden platform.

  1. Jellycan-kode har en ændret version af Memcached, der er nem og effektiv at arbejde med. Start her ved at downloade win32 binær ZIP-fil
  2. Udvide Memcached--win32-bin.zip på din harddisk. Bemærk, at alt det indeholder er memcached.exe. Udfør denne fil for at starte Memcached-serveren.
  3. Udfør nu memcached.exe -d installation for at registrere memcached.exe som en tjeneste. Du kan bruge Services-konsollen til at starte og stoppe Memcached-serveren.

CL start / stop

Prøv at starte og stoppe Memcached-serveren fra kommandolinjen i stedet for fra et servicepanel. Dette gør det mere fleksibelt at prøve forskellige kommandolinjemuligheder og finde ud af den bedst mulige konfiguration til dine behov.

Når du udfører memcached.exe uden nogen kommandolinjemuligheder starter Memcached-serveren som standard på port 11211 med 64 MB hukommelse. I nogle tilfælde vil du måske have mere detaljeret kontrol over konfigurationen. Lad os f.eks. Sige, at port 11211 bruges af en anden proces på din maskine, og du vil have, at Memcached-serveren bruger port 12000; eller hvis du startede Memcached-server i et QA- eller produktionsmiljø, ville du gerne give den mere hukommelse end standard 64 MB. I disse tilfælde kan du bruge kommandolinjemuligheder til at tilpasse serverens adfærd. Udfører memcache.exe -hjælp kommando giver en komplet liste over kommandolinjemuligheder som dem, der er vist i figur 3.

Opret forbindelse til Memcached via Telnet

Når Memcached-serveren er startet, lytter den til den port, du har tildelt den. Memcached-klienten opretter forbindelse til serveren på enten TCP- eller UDP-porten, sender kommandoer og modtager svar og til sidst lukker forbindelsen. (Se Ressourcer for detaljer om den protokol, som klienten bruger til at kommunikere med serveren.)

Du kan oprette forbindelse til din Memcached-server på en række forskellige måder. Hvis du bruger en Java-klient, som vi gør i anden halvdel af denne vejledning, kan du få adgang til en simpel API til lagring og hentning af objekter fra cachen. Alternativt kan du bruge en Telnet-klient til at oprette forbindelse direkte til serveren. At vide, hvordan man bruger Telnet-klienten til at kommunikere med Memcached-serveren, er vigtig for fejlfinding af Java-klienten, så vi starter der.

Telnet-kommandoer

Først skal du bruge den valgte Telnet-klient til at oprette forbindelse til Memcached-serveren. På en Windows XP-maskine kan du bare udføre telnet localhost 11211 forudsat at Memcached-serveren kører på den samme maskine og lytter til standard 11211-porten. Følgende kommandoer er vigtige for at arbejde med Memcached via Telnet:

  • sæt tilføjer et nyt element til cachen. Opkaldet er: Sæt . Du kan skrive den aktuelle værdi, der skal gemmes på den næste linje. Hvis du ikke ønsker, at cacheindgangen skal udløbe, skal du indtaste 0 som værdi.
  • returnerer værdien af ​​cache-nøglen. Brug for at få værdien af nøglenavn.
  • tilføje tilføjer kun en ny nøgle, hvis den ikke allerede findes. For eksempel: tilføje
  • erstatte erstatter kun en værdi, hvis nøglen findes. For eksempel: erstatte
  • slet sletter cacheindgangen for nøglen. Du kan bruge opkaldet slet for at slette værdien af nøglenavn.

Skærmbilledet i figur 4 repræsenterer en prøveinteraktion med Memcached-serveren via Telnet. Som du kan se, giver Memcached-serveren feedback til hver kommando, f.eks GEMT, NOT_STORED, og så videre.

Konklusion på del 1

Indtil videre har vi kort diskuteret forskellene mellem Memcaches distribuerede arkitektur og mere traditionelle Java-cache-systemer. Vi har også oprettet en Memcached-implementering i dit udviklingsmiljø, og du har øvet dig i at oprette forbindelse til Memcached via Telnet. I den næste del af denne vejledning bruger vi Java-klient-spymemcached til at oprette en distribueret cacheløsning til en prøve-Java-applikation. I processen lærer du meget mere om Memcached, og hvordan det kan forbedre ydeevnen for dine Java EE-applikationer.

Sunil Patil er en Java EE-arkitekt, der arbejder for Avnet Technology i San Francisco, Californien. Han er forfatter til Java-portletter 101 (SourceBeat, april 2007) og har skrevet adskillige artikler udgivet af JavaWorld, IBM developerWorks og O'Reilly Media. Ud over at være en IBM Certified WebSphere Portal Server Application Developer og Administer, er han også en Sun Microsystems Certified Java Programmer, en Web komponentudvikler og en forretningskomponentudvikler. Du kan se Sunils blog på //www.webspherenotes.com.