Programmering

Bruk Memcached for Java-virksomhetsytelse, del 1: Arkitektur og oppsett

Utviklet av Danga Interactive for å forbedre nettstedets ytelse på LiveJournal.com, støtter Memcacheds distribuerte arkitektur i dag den eksponentielle skalerbarheten til sosiale webapplikasjoner som Twitter, Facebook og Wikipedia. I denne todelte opplæringen introduserer Sunil Patil Memcached's distribuerte hashtable-arkitektur og kommer i gang med å bruke den til å cache data for dine egne databasedrevne Java-bedriftsapplikasjoner.

Denne opplæringen introduserer deg for å bruke Memcached for å forbedre ytelsen til Java enterprise-applikasjoner. Første halvdel starter med en oversikt over tradisjonelle Java-cachearkitekturer sammenlignet med Memcaches arkitektur. Vi får også Memcached installert på maskinen din, og jeg vil introdusere deg for oppsett og kommandoer for å jobbe med Memcached via Telnet. I andre halvdel utvikler vi et "Hello Memcached" -klientprogram i Java, som vi vil bruke til å se under panseret til en klient med hurtigkopiering. Du vil også lære om bruk av Memcached for å redusere belastningen på databaseserveren din, og bruke den til å cache dynamisk generert sidemarkering. Til slutt vil vi vurdere noen avanserte alternativer for å konfigurere spymemached klienter.

Mer om Java-caching på JavaWorld

  • Se "Server load balancing architectures, Part 1: Transport-level load balancing" for en mer inngående diskusjon av distribuert caching med Memcached.
  • Se også "Open source Java-prosjekter: Java Caching System" for å lære om tradisjonell Java-caching.

Oversikt over Memcached og Java caching-arkitekturer

Java caching-rammer som EHCache og OSCache er egentlig HashMap objekter i applikasjonskoden. Når du legger til et nytt objekt i hurtigbufferen, lagres det i minnet til applikasjonen. Denne strategien fungerer bra for lagring av små datamengder, men den fungerer ikke for hurtigbufring av mer enn få gigabyte (GB). Designerne av Memcached-serveren tok en distribuert arkitektonisk tilnærming, som muliggjør systemskalerbarhet. Som et resultat kan du bruke Memcached til å cache en enorm mengde data.

Arkitekturen til Memcached består av to stykker. Først er en Memcached-server som kjører i sin egen prosess. Hvis du vil skalere applikasjonen din, kan du installere og kjøre Memcached-serveren på flere maskiner. Forekomster av Memcached-serveren kjenner ikke til hverandre. Memcached-klienten, den andre delen av Memcached-systemet, gjør vet om hver av serverne. Klienten er ansvarlig for å plukke opp serveren for hver cacheoppføring og enten lagre eller få cacheoppføringen - en prosess jeg vil diskutere i detalj senere i artikkelen.

Hvis du har litt erfaring med å jobbe med Java EE-webapplikasjoner, er sjansen stor for at du tidligere har brukt et åpen kildekode-Java-caching-rammeverk som EHCache eller OSCache. Du har kanskje også brukt et kommersielt hurtigbufferammeverk som ble levert som en del av applikasjonsserveren din, for eksempel DynaCache (som leveres med IBM WebSphere Application Server) eller JBoss Cache (som leveres med JBoss AS). Før vi kommer inn i den praktiske læringsdelen av denne opplæringen, er det viktig å forstå hvordan Memcached skiller seg fra disse tradisjonelle Java-cacherammene.

Bruker en tradisjonell Java-cache

Å bruke et tradisjonelt Java-cacherammeverk er ganske enkelt, uansett om du velger en åpen kildekode eller et kommersielt alternativ. For et rammeverk med åpen kildekode som EHCache eller OSCache, må du laste ned binærfiler og legge til nødvendige JAR-filer på klassesiden til applikasjonen. Du må kanskje også opprette en konfigurasjonsfil, som du vil bruke til å konfigurere størrelsen på hurtigbufferen, diskavlastning og så videre. For et caching-rammeverk som fulgte med en applikasjonsserver, trenger du vanligvis ikke å laste ned noen ekstra JAR-er, fordi de følger med programvaren.

Etter å ha lagt til støtte for cacherammeverket i applikasjonen din, kan du begynne å bruke den ved å opprette en CacheManager objekt og få og sette cacheoppføringer i den. Under panseret ville caching-rammeverket skape CacheManager objekter i samme JVM som applikasjonen kjørte. Hver gang du legger til en cacheoppføring, vil det objektet også legges til i en eller annen type hashtable som vedlikeholdes av hurtigbufferammen.

Hvis applikasjonsserveren kjørte på flere noder, vil du kanskje også ha støtte for distribuert caching. I et distribuert cache-system, når du legger til et objekt i cachen på AppServer1, er det objektet også tilgjengelig på AppServer2 og AppServer3. Tradisjonell bruk av Java-hurtigbuffere replikering for distribuert caching, noe som betyr at når du legger til en cacheoppføring på AppServer1, blir den automatisk replikert til de andre app-serverne i systemet ditt. Som et resultat vil oppføringen være tilgjengelig på alle nodene dine.

Bruke Memcached

For å kunne bruke Memcached til hurtigbufring, må du først laste ned og installere Memcached-serveren for den valgte plattformen. Når du har installert Memcached-serveren, vil den lytte på enten en TCP- eller UDP-port for caching-samtaler.

Deretter laster du ned en Java-klient for Memcached og legger til klient-JARer i applikasjonen din. Etter det kan du opprette et Memcached-klientobjekt og begynne å ringe metoden for å hente og angi cacheoppføringer. Når du legger til et objekt i hurtigbufferen, tar Memcached-klienten det objektet, serialiserer det og sender et byte-array til Memcached-serveren for lagring. På det tidspunktet kan det bufrede objektet være søppel hentet fra JVM der applikasjonen kjører.

Når du trenger det bufrede objektet, kan du ringe Memcached-klienten få() metode. Kunden vil ta forespørsel, serialisere den og sende den til Memcached-serveren. Memcached-serveren vil bruke forespørselen til å slå opp objektet fra hurtigbufferen. Når den har objektet, returnerer den byte-arrayet tilbake til Memcached-klienten. Memcached-klientobjektet tar deretter byte-arrayet og deserialiserer det for å opprette objektet og returnere det til applikasjonen din.

Selv om applikasjonen din kjører på mer enn en applikasjonsserver, kan alle peke på den samme Memcached-serveren og bruke den til å hente og sette inn cacheoppføringer. Hvis du har mer enn en Memcached-server, vet ikke serverne om hverandre. I stedet konfigurerer du Memcached-klienten slik at den kjenner alle tilgjengelige Memcached-servere. For eksempel, hvis applikasjonen oppretter et Java-objekt på AppServer1 og ringer til sett() metode for Memcached, vil Memcached-klienten finne ut hvilken Memcached-server den oppføringen går til. Deretter begynner det bare å kommunisere med den Memcached-serveren. Likeledes når koden din i AppServer2 eller AppServer3 prøver å en oppføring, vil Memcached-klienten først finne ut hvilken server oppføringen er lagret på, og deretter kun kommunisere med den serveren.

Memcached klientlogikk

I sin standardkonfigurasjon bruker Memcached-klienten veldig enkel logikk for å velge serveren for en get eller set-operasjon. Når du lager en få() eller sett() anrop, klienten tar hurtigbuffertasten og ringer til den hashCode () metode for å få et heltall som 11. Det tar da tallet og deler det med antall tilgjengelige Memcached-servere, si to. Det tar deretter verdien av resten, som er 1 i dette tilfellet. Cache-oppføringen vil gå til Memcached-server 1. Denne enkle algoritmen sikrer at Memcached-klienten på hver av applikasjonsserverne alltid velger den samme serveren for en gitt cache-nøkkel.

Installerer Memcached

Memcached kjører på Unix, Linux, Windows og MacOSX. Du kan enten laste ned Memcached-kilden og kompilere den, eller du kan laste ned binærfiler som er samlet av noen andre og bruke dem til å installere Memcached. Her vil jeg gå gjennom prosessen med å laste ned binærfiler for den valgte plattformen; se Ressurser hvis du foretrekker å kompilere fra kilden.

Følgende installasjonsinstruksjoner gjelder for en Windows XP 32-bits maskin. Se Ressurser for installasjonsinstruksjoner for andre plattformer som Linux. Vær også oppmerksom på at eksempelkoden for denne artikkelen ble utviklet på en Windows XP 32-bits maskin, selv om den skulle fungere på en hvilken som helst annen plattform.

  1. Jellycan-kode har en modifisert versjon av Memcached som er enkel og effektiv å jobbe med. Start her ved å laste ned win32 binær ZIP-fil
  2. Utvide Memcached--win32-bin.zip på harddisken. Merk at alt det inneholder er memcached.exe. Utfør denne filen for å starte Memcached-serveren.
  3. Nå utfør memcached.exe -d installere for å registrere memcached.exe som en tjeneste. Du kan bruke tjenestekonsollen til å starte og stoppe Memcached-serveren.

CL start / stopp

Prøv å starte og stoppe Memcached-serveren fra kommandolinjen i stedet for fra et tjenestepanel. Å gjøre det vil gi deg mer fleksibilitet til å prøve forskjellige kommandolinjealternativer og finne ut den best mulige konfigurasjonen for dine behov.

Når du utfører memcached.exe uten kommandolinjealternativer, starter Memcached-serveren som standard på port 11211 med 64 MB minne. I noen tilfeller vil du kanskje ha mer detaljert kontroll over konfigurasjonen. La oss for eksempel si at port 11211 brukes av en annen prosess på maskinen din, og at Memcached-serveren skal bruke port 12000; eller hvis du startet Memcached-server i et kvalitets- eller produksjonsmiljø, vil du gi det mer minne enn standard 64 MB. I disse tilfellene kan du bruke kommandolinjealternativer for å tilpasse serverens oppførsel. Gjennomføring av memcache.exe -hjelp kommandoen vil gi en komplett liste over kommandolinjealternativer som de som er vist i figur 3.

Koble til Memcached via Telnet

Etter at Memcached-serveren er startet, lytter den til porten du har tildelt den. Memcached-klienten kobles til serveren på enten TCP- eller UDP-porten, sender kommandoer og mottar svar, og til slutt stenger tilkoblingen. (Se Ressurser for detaljer om protokollen klienten bruker for å kommunisere med serveren.)

Du kan koble til din Memcached-server på en rekke måter. Hvis du bruker en Java-klient, som vi vil gjøre i andre halvdel av denne opplæringen, vil du kunne få tilgang til et enkelt API for lagring og henting av objekter fra hurtigbufferen. Alternativt kan du bruke en Telnet-klient til å koble direkte til serveren. Å vite hvordan du bruker Telnet-klienten til å kommunisere med Memcached-serveren er viktig for feilsøking av Java-klienten, så vi begynner der.

Telnet-kommandoer

Først må du bruke den valgte Telnet-klienten for å koble til Memcached-serveren. På en Windows XP-maskin kan du bare kjøre telnet localhost 11211 forutsatt at Memcached-serveren kjører på samme maskin og hører på standard 11211-porten. Følgende kommandoer er avgjørende for å jobbe med Memcached via Telnet:

  • sett legger til et nytt element i hurtigbufferen. Samtalen er: Sett . Du kan skrive inn den faktiske verdien som skal lagres på neste linje. Hvis du ikke vil at hurtigbufferoppføringen skal utløpe, skriv inn 0 som verdi.
  • returnerer verdien til hurtigbuffernøkkelen. Bruk for å få verdien av nøkkelnavn.
  • legge til legger til en ny nøkkel bare hvis den ikke allerede eksisterer. For eksempel: legge til
  • erstatte erstatter bare en verdi hvis nøkkelen eksisterer. For eksempel: erstatte
  • slett sletter cacheoppføringen for nøkkelen. Du kan bruke samtalen slett for å slette verdien av nøkkelnavn.

Skjermbildet i figur 4 representerer et eksempel på interaksjon med Memcached-serveren via Telnet. Som du kan se, gir Memcached-serveren tilbakemelding til hver kommando, for eksempel LAGRET, IKKE LAGRET, og så videre.

Konklusjon til del 1

Så langt har vi kort diskutert forskjellene mellom Memcaches distribuerte arkitektur og mer tradisjonelle Java-cache-systemer. Vi har også satt opp en Memcached-implementering i utviklingsmiljøet ditt, og du har trent på å koble til Memcached via Telnet. I neste del av denne opplæringen bruker vi Java-klient-spymemcached til å sette opp en distribuert caching-løsning for et Java-program. I prosessen lærer du mye mer om Memcached og hvordan det kan forbedre ytelsen til Java EE-applikasjonene dine.

Sunil Patil er en Java EE-arkitekt som jobber for Avnet Technology i San Francisco, California. Han er forfatteren av Java Portlets 101 (SourceBeat, april 2007) og har skrevet en rekke artikler publisert av JavaWorld, IBM developerWorks og O'Reilly Media. I tillegg til å være en IBM Certified WebSphere Portal Server Application Developer og Administer, er han en Sun Microsystems Certified Java Programmer, en webkomponentutvikler og en business komponentutvikler. Du kan se bloggen til Sunil på //www.webspherenotes.com.

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