Използвайте Memcached за корпоративно изпълнение на Java, Част 1: Архитектура и настройка

Разработена от Danga Interactive за подобряване на производителността на сайта в LiveJournal.com, разпределената архитектура на Memcached днес поддържа експоненциалната мащабируемост на социални уеб приложения като Twitter, Facebook и Wikipedia. В този урок от две части Sunil Patil въвежда разпределената хеш-таблична архитектура на Memcached и започва да я използвате за кеширане на данни за вашите собствени корпоративни приложения, управлявани от база данни на Java.

Този урок ви запознава с използването на Memcached за подобряване на производителността на Java корпоративни приложения. Първото полувреме започва с преглед на традиционните архитектури за кеширане на Java в сравнение с архитектурата на Memcached. Също така ще инсталираме Memcached на вашата машина и ще ви запозная с настройката и командите за работа с Memcached чрез Telnet. Във втората половина ще разработим клиентска програма "Hello Memcached" в Java, която ще използваме, за да погледнем под капака на спамкеширан клиент. Също така ще научите за използването на Memcached за намаляване на натоварването на вашия сървър на база данни и за използването му за кеширане на динамично генерирани маркировки на страници. И накрая, ще разгледаме някои разширени опции за конфигуриране на клиенти със спам кеш.

Повече за кеширането на Java в JavaWorld

  • Вижте "Архитектури за балансиране на натоварването на сървъра, Част 1: Балансиране на натоварване на транспортно ниво" за по-задълбочено обсъждане на разпределеното кеширане с Memcached.
  • Вижте също „Проекти Java с отворен код: Система за кеширане на Java“, за да научите за традиционното кеширане на Java.

Общ преглед на архитектурите за кеширане Memcached и Java

Структурите за кеширане на Java като EHCache и OSCache са по същество HashMapобекти в кода на вашето приложение. Всеки път, когато добавите нов обект към кеша, той ще се съхранява в паметта на вашето приложение. Тази стратегия работи добре за съхраняване на малки количества данни, но не работи за кеширане на повече от няколко гигабайта (GB). Дизайнерите на сървъра Memcached са използвали разпределен архитектурен подход, който позволява мащабиране на системата. В резултат на това можете да използвате Memcached, за да кеширате огромно количество данни.

Архитектурата на Memcached се състои от две части. Първият е Memcached сървър, който работи в свой собствен процес. Ако искате да мащабирате приложението си, можете да инсталирате и стартирате сървъра Memcached на допълнителни машини. Екземплярите на сървъра Memcached не са наясно един с друг. В Memcached клиента, втората част на Memcached система, се знае за всеки един от сървърите. Клиентът е отговорен за взимането на сървъра за всеки запис в кеша и за съхраняване или получаване на записа в кеша - процес, който ще обсъдя подробно по-късно в статията.

Ако имате някакъв опит в работата с уеб приложения на Java EE, вероятно сте използвали предварително кешираща рамка на Java с отворен код като EHCache или OSCache. Може да сте използвали и търговска рамка за кеширане, която се доставя като част от вашия сървър за приложения, като DynaCache (който се доставя с IBM WebSphere Application Server) или JBoss Cache (който се доставя с JBoss AS). Преди да влезем в практическата част на този урок, важно е да разберем как Memcached се различава от тези традиционни рамки за кеширане на Java.

Използване на традиционен кеш на Java

Използването на традиционна рамка за кеширане на Java е доста лесно, независимо дали сте избрали опция с отворен код или търговска опция. За рамка с отворен код, като EHCache или OSCache, ще трябва да изтеглите двоичните файлове и да добавите необходимите JAR файлове към пътя на класа на вашето приложение. Може също да се наложи да създадете конфигурационен файл, който бихте използвали, за да конфигурирате размера на кеша, разтоварването на диска и т.н. За рамка за кеширане, която се доставя в комплект със сървър за приложения, обикновено няма да се налага да изтегляте допълнителни JAR, тъй като те ще бъдат в комплект със софтуера.

След като добавите поддръжка за рамката за кеширане във вашето приложение, можете да започнете да го използвате, като създадете CacheManagerобект и вземете и зададете записи в кеша в него. Под качулката рамката за кеширане ще създаде CacheManagerобектите в същия JVM, където се изпълнява приложението ви. Всеки път, когато добавяте запис в кеш, този обект също ще бъде добавен към някакъв тип хеш-таблица, поддържана от рамката за кеширане.

Ако сървърът ви за приложения се изпълнява на множество възли, тогава може да искате и поддръжка за разпределено кеширане. В разпределена кеш система, когато добавяте обект в кеш на AppServer1, този обект е наличен и на AppServer2 и AppServer3. Традиционните кешове на Java използват репликация за разпределено кеширане, което означава, че когато добавяте запис на кеш в AppServer1, той автоматично се репликира към другите сървъри на приложения във вашата система. В резултат на това записът ще бъде достъпен на всички ваши възли.

Използване на Memcached

За да използвате Memcached за кеширане, първо трябва да изтеглите и инсталирате Memcached сървъра за избраната от вас платформа. След като инсталирате сървъра Memcached, той ще слуша или TCP или UDP порт за кеширане на повиквания.

След това ще изтеглите Java клиент за Memcached и ще добавите клиентските JAR към вашето приложение. След това можете да създадете клиентски обект Memcached и да започнете да извиквате метода му, за да получите и зададете записи в кеша. Когато добавите обект към кеша, клиентът Memcached ще вземе този обект, ще го сериализира и ще изпрати байтов масив на Memcached сървъра за съхранение. В този момент кешираният обект може да е боклук, събран от JVM, където се изпълнява приложението ви.

Когато имате нужда от този кеширан обект, можете да извикате метода на клиента Memcached get(). Клиентът ще вземе getзаявката, ще я сериализира и ще я изпрати на сървъра Memcached. Сървърът Memcached ще използва заявката, за да търси обекта от кеша. След като има обекта, той ще върне байтовия масив обратно към клиента Memcached. След това клиентският обект Memcached ще вземе байтовия масив и ще го десериализира, за да създаде обекта и да го върне във вашето приложение.

Дори ако вашето приложение се изпълнява на повече от един сървър за приложения, всички те могат да сочат към един и същ Memcached сървър и да го използват за получаване и настройване на записи в кеша. Ако имате повече от един Memcached сървър, сървърите няма да знаят един за друг. Вместо това ще конфигурирате вашия Memcached клиент, така че той да знае всички налични Memcached сървъри. Например, ако вашето приложение създава Java обект на AppServer1 и извиква set()метода на Memcached, тогава клиентът на Memcached ще разбере към кой Memcached сървър отива този запис. След това ще започне да комуникира само с този Memcached сървър. По същия начин, когато вашият код в AppServer2 или AppServer3 се опитва да getвъведе запис, клиентът Memcached първо ще разбере на кой сървър е записан този запис и след това ще комуникира само с този сървър.

Memcached клиентска логика

В конфигурацията си по подразбиране клиентът Memcached използва много проста логика, за да избере сървъра за операция за получаване или задаване. Когато осъществите повикване get()или set()обаждане, клиентът взема кеш ключа и извиква своя hashCode()метод, за да получи цяло число като 11. След това взема този номер и го разделя на броя на наличните Memcached сървъри, да речем две. След това приема стойността на остатъка, която в този случай е 1. Записът в кеша ще отиде в Memcached сървър 1. Този прост алгоритъм гарантира, че клиентът Memcached на всеки от вашите сървъри за приложения винаги избира един и същ сървър за даден кеш ключ.

Инсталиране на Memcached

Memcached работи на Unix, Linux, Windows и MacOSX. Можете или да изтеглите източника Memcached и да го компилирате, или можете да изтеглите двоичните файлове, съставени от някой друг, и да ги използвате за инсталиране на Memcached. Тук ще разгледам процеса на изтегляне на двоичните файлове за избраната от вас платформа; вижте Ресурси, ако предпочитате да компилирате от източник.

Следните инструкции за инсталиране са за 32-битова машина с Windows XP. Вижте Ресурси за инструкции за инсталиране на други платформи като Linux. Също така имайте предвид, че примерният код за тази статия е разработен на 32-битова машина с Windows XP, въпреки че трябва да работи на всяка друга платформа.

  1. Кодът на Jellycan има модифицирана версия на Memcached, която е лесна и ефективна за работа. Започнете от тук, като изтеглите двоичния ZIP файл на win32
  2. Разширете Memcached--win32-bin.zipна вашия твърд диск. Имайте предвид, че всичко, което съдържа, е memcached.exe. Изпълнете този файл, за да стартирате Memcached сървъра.
  3. Сега изпълнете, за memcached.exe -d installда регистрирате memcached.exe като услуга. Ще можете да използвате конзолата за услуги, за да стартирате и спрете Memcached сървъра.

CL старт / стоп

Опитайте да стартирате и спрете сървъра Memcached от командния ред вместо от панела за услуги. Това ще ви даде повече гъвкавост, за да изпробвате различни опции на командния ред и да разберете най-добрата възможна конфигурация за вашите изисквания.

Когато изпълнявате memcached.exeопциите без команден ред, по подразбиране сървърът Memcached ще се стартира на порт 11211 с 64 MB памет. В някои случаи може да искате да имате по-подробен контрол върху конфигурацията. Например, да кажем, че порт 11211 се използва от някакъв друг процес на вашата машина и искате сървърът Memcached да използва порт 12000; или ако стартирате Memcached сървър в QA или производствена среда, бихте искали да му предоставите повече памет от стандартните 64 MB. В тези случаи можете да използвате опциите на командния ред, за да персонализирате поведението на сървъра. Изпълнението на memcache.exe -helpкомандата ще даде пълен списък с опции на командния ред, като показаните на Фигура 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:

  • setдобавя нов елемент към кеша. Поканата е: Set . Можете да въведете действителната стойност, която трябва да се съхранява на следващия ред. Ако не искате записът в кеша да изтече, въведете 0 като стойност.
  • getвръща стойността на кеш ключа. Използвайте, за get да получите стойността на keyName.
  • addдобавя нов ключ само ако вече не съществува. Например:add
  • replaceще замени стойност само ако ключът съществува. Например:replace
  • deleteизтрива записа в кеша за ключа. Можете да използвате обаждането, за delete да изтриете стойността на keyName.

Екранната снимка на фигура 4 представлява примерно взаимодействие със сървъра Memcached чрез Telnet. Както можете да видите, Memcached сървър осигурява обратна връзка за всяка команда, като например STORED, NOT_STOREDи така нататък.

Заключение към част 1

Досега обсъдихме накратко разликите между разпределената архитектура на Memcached и по-традиционните кеш системи на Java. Също така сме настроили внедряване на Memcached във вашата среда за разработка и сте тренирали да се свързвате с Memcached чрез Telnet. В следващата част на този урок ще използваме Java client spymemcached, за да настроим решение за разпределено кеширане за примерно Java приложение. В процеса ще научите много повече за Memcached и как той може да подобри производителността на вашите Java EE приложения.

Sunil Patil е Java EE Architect, работещ за Avnet Technology в Сан Франциско, Калифорния. Той е автор на Java Portlets 101 (SourceBeat, април 2007 г.) и е написал множество статии, публикувани от JavaWorld, IBM developerWorks и O'Reilly Media. Освен че е IBM Certified WebSphere Portal Server Application Developer и Administer, той е сертифициран Java програмист на Sun Microsystems, разработчик на уеб компоненти и разработчик на бизнес компоненти. Можете да видите блога на Sunil на //www.webspherenotes.com.