Użyj Memcached, aby zwiększyć wydajność przedsiębiorstwa w języku Java, część 1: Architektura i konfiguracja

Opracowana przez Danga Interactive w celu poprawy wydajności witryny na LiveJournal.com, rozproszona architektura Memcached obsługuje dziś wykładniczą skalowalność aplikacji społecznościowych, takich jak Twitter, Facebook i Wikipedia. W tym dwuczęściowym samouczku Sunil Patil przedstawia rozproszoną architekturę z możliwością haszowania Memcached i pomaga rozpocząć korzystanie z niej do buforowania danych dla własnych aplikacji korporacyjnych Java opartych na bazie danych.

Ten samouczek zawiera wprowadzenie do korzystania z Memcached w celu poprawy wydajności aplikacji korporacyjnych Java. Pierwsza połowa rozpoczyna się od przeglądu tradycyjnych architektur buforowania Java w porównaniu z architekturą Memcached. Zainstalujemy również Memcached na twoim komputerze i przedstawię ci konfigurację i polecenia do pracy z Memcached przez Telnet. W drugiej połowie opracujemy program kliencki „Hello Memcached” w Javie, którego użyjemy do zajrzenia pod maskę klienta buforowanego przez szpiegów. Dowiesz się również o używaniu Memcached do zmniejszania obciążenia serwera bazy danych i używaniu go do buforowania dynamicznie generowanych znaczników stron. Na koniec rozważymy kilka zaawansowanych opcji konfiguracji klientów buforowanych przez szpiegów.

Więcej o buforowaniu Java w JavaWorld

  • Zobacz „Architektury równoważenia obciążenia serwera, Część 1: Równoważenie obciążenia na poziomie transportu”, aby uzyskać bardziej szczegółowe omówienie rozproszonego buforowania w Memcached.
  • Zobacz także „Projekty Java open source: system buforowania Java”, aby dowiedzieć się więcej o tradycyjnym buforowaniu Java.

Przegląd architektur pamięci podręcznej Memcached i Java

Struktury buforowania Java, takie jak EHCache i OSCache, są zasadniczo HashMapobiektami w kodzie aplikacji. Za każdym razem, gdy dodasz nowy obiekt do pamięci podręcznej, zostanie on zapisany w pamięci Twojej aplikacji. Ta strategia działa dobrze w przypadku przechowywania małych ilości danych, ale nie działa w przypadku buforowania więcej niż kilka gigabajtów (GB). Projektanci serwera Memcached przyjęli rozproszone podejście architektoniczne, które pozwala na skalowalność systemu. W rezultacie możesz użyć Memcached do buforowania ogromnej ilości danych.

Architektura Memcached składa się z dwóch części. Pierwszy to serwer Memcached, który działa we własnym procesie. Jeśli chcesz skalować swoją aplikację, możesz zainstalować i uruchomić serwer Memcached na dodatkowych maszynach. Instancje serwera Memcached nie rozpoznają się nawzajem. Memcached klient, drugi kawałek systemu memcached, nie wie o każdym z serwerów. Klient jest odpowiedzialny za wybranie serwera dla każdego wpisu pamięci podręcznej i przechowywanie lub pobieranie tego wpisu - proces, który omówię szczegółowo w dalszej części artykułu.

Jeśli masz doświadczenie w pracy z aplikacjami internetowymi Java EE, prawdopodobnie wcześniej korzystałeś z platformy buforowania Java typu open source, takiej jak EHCache lub OSCache. Możliwe, że korzystałeś również z komercyjnej struktury buforowania dostarczanej jako część serwera aplikacji, takiej jak DynaCache (dostarczana z serwerem IBM WebSphere Application Server) lub JBoss Cache (dostarczana z JBoss AS). Zanim przejdziemy do praktycznej części tego samouczka, ważne jest, aby zrozumieć, w jaki sposób Memcached różni się od tych tradycyjnych struktur buforowania Java.

Korzystanie z tradycyjnej pamięci podręcznej Java

Korzystanie z tradycyjnego środowiska buforowania Java jest dość łatwe, niezależnie od tego, czy wybierzesz opcję open source, czy komercyjną. W przypadku architektury open source, takiej jak EHCache lub OSCache, należy pobrać pliki binarne i dodać niezbędne pliki JAR do ścieżki klas aplikacji. Może być również konieczne utworzenie pliku konfiguracyjnego, którego użyjesz do skonfigurowania rozmiaru pamięci podręcznej, odciążania dysku i tak dalej. W przypadku struktury buforowania dostarczonej w pakiecie z serwerem aplikacji zazwyczaj nie trzeba pobierać żadnych dodatkowych plików JAR, ponieważ byłyby one dołączone do oprogramowania.

Po dodaniu obsługi struktury buforowania do aplikacji, możesz zacząć jej używać, tworząc CacheManagerobiekt oraz pobierając i ustawiając w nim wpisy pamięci podręcznej. Pod maską struktura buforowania utworzyłaby CacheManagerobiekty w tej samej JVM, w której działała aplikacja. Za każdym razem, gdy dodawałeś wpis pamięci podręcznej, ten obiekt byłby również dodawany do pewnego typu tablicy hashy obsługiwanej przez strukturę buforowania.

Jeśli serwer aplikacji działał na wielu węzłach, możesz również potrzebować obsługi rozproszonego buforowania. W systemie rozproszonej pamięci podręcznej po dodaniu obiektu do pamięci podręcznej na serwerze AppServer1 obiekt ten jest również dostępny na serwerze AppServer2 i AppServer3. Tradycyjne pamięci podręczne Java używają replikacji do buforowania rozproszonego, co oznacza, że ​​po dodaniu wpisu pamięci podręcznej na serwerze AppServer1 jest on automatycznie replikowany na inne serwery aplikacji w systemie. W rezultacie wpis będzie dostępny na wszystkich twoich węzłach.

Korzystanie z Memcached

Aby używać Memcached do buforowania, musisz najpierw pobrać i zainstalować serwer Memcached dla wybranej platformy. Po zainstalowaniu serwer Memcached nasłuchuje na porcie TCP lub UDP w celu buforowania połączeń.

Następnie pobierzesz klienta Java dla Memcached i dodasz klienckie pliki JAR do swojej aplikacji. Następnie możesz utworzyć obiekt klienta Memcached i rozpocząć wywoływanie jego metody, aby pobrać i ustawić wpisy pamięci podręcznej. Kiedy dodajesz obiekt do pamięci podręcznej, klient Memcached pobierze ten obiekt, serializuje go i wyśle ​​tablicę bajtów do serwera Memcached w celu przechowywania. W tym momencie buforowany obiekt może zostać usunięty z pamięci JVM, na której działa aplikacja.

Kiedy potrzebujesz tego zbuforowanego obiektu, możesz wywołać get()metodę klienta Memcached . Klient przyjmie getżądanie, serializuje je i prześle do serwera Memcached. Serwer Memcached użyje żądania do wyszukania obiektu z pamięci podręcznej. Gdy już ma obiekt, zwróci tablicę bajtów z powrotem do klienta Memcached. Obiekt klienta Memcached pobierze następnie tablicę bajtów i deserializuje ją, aby utworzyć obiekt i zwrócić go do aplikacji.

Nawet jeśli Twoja aplikacja działa na więcej niż jednym serwerze aplikacji, wszystkie z nich mogą wskazywać na ten sam serwer Memcached i używać go do pobierania i ustawiania wpisów pamięci podręcznej. Jeśli masz więcej niż jeden serwer Memcached, serwery nie będą o sobie wiedzieć. Zamiast tego skonfigurujesz swojego klienta Memcached tak, aby znał wszystkie dostępne serwery Memcached. Na przykład, jeśli twoja aplikacja tworzy obiekt Java na AppServer1 i wywołuje set()metodę Memcached, wtedy klient Memcached dowie się, do którego serwera Memcached trafia ten wpis. Wtedy zacznie komunikować się tylko z tym serwerem Memcached. Podobnie, gdy kod w AppServer2 lub AppServer3 próbuje getwprowadzić wpis, klient Memcached najpierw ustali, na którym serwerze jest przechowywany ten wpis, a następnie komunikuje się tylko z tym serwerem.

Logika klienta Memcached

W swojej domyślnej konfiguracji klient Memcached używa bardzo prostej logiki do wyboru serwera do operacji pobierania lub ustawiania. Kiedy wykonujesz połączenie get()lub set(), klient bierze klucz pamięci podręcznej i wywołuje swoją hashCode()metodę, aby uzyskać liczbę całkowitą, taką jak 11. Następnie bierze tę liczbę i dzieli ją przez liczbę dostępnych serwerów Memcached, powiedzmy dwa. Następnie przyjmuje wartość pozostałej części, która w tym przypadku wynosi 1. Wpis pamięci podręcznej przejdzie do serwera Memcached 1. Ten prosty algorytm zapewnia, że ​​klient Memcached na każdym z serwerów aplikacji zawsze wybiera ten sam serwer dla danego klucza pamięci podręcznej.

Instalowanie Memcached

Memcached działa w systemach Unix, Linux, Windows i MacOSX. Możesz pobrać źródło Memcached i skompilować je lub możesz pobrać pliki binarne skompilowane przez kogoś innego i użyć ich do zainstalowania Memcached. Tutaj omówię proces pobierania plików binarnych dla wybranej platformy; zobacz Zasoby, jeśli wolisz kompilować ze źródeł.

Poniższe instrukcje instalacji dotyczą 32-bitowego komputera z systemem Windows XP. Zobacz Zasoby, aby uzyskać instrukcje instalacji dla innych platform, takich jak Linux. Zwróć również uwagę, że przykładowy kod dla tego artykułu został opracowany na komputerze z 32-bitowym systemem Windows XP, chociaż powinien działać na każdej innej platformie.

  1. Kod Jellycan ma zmodyfikowaną wersję Memcached, z którą łatwo i wydajnie pracować. Zacznij tutaj, pobierając binarny plik ZIP win32
  2. Rozwiń Memcached--win32-bin.zipswój dysk twardy. Zauważ, że wszystko, co zawiera, to memcached.exe. Uruchom ten plik, aby uruchomić serwer Memcached.
  3. Teraz wykonaj, memcached.exe -d installaby zarejestrować memcached.exe jako usługę. Będziesz mógł użyć konsoli Usługi, aby uruchomić i zatrzymać serwer Memcached.

CL start / stop

Spróbuj uruchomić i zatrzymać serwer Memcached z wiersza poleceń zamiast z panelu usług. Dzięki temu uzyskasz większą elastyczność podczas wypróbowywania różnych opcji wiersza polecenia i określania najlepszej możliwej konfiguracji dla Twoich wymagań.

Gdy wykonasz memcached.exepolecenie bez żadnych opcji wiersza poleceń, domyślnie serwer Memcached uruchomi się na porcie 11211 z 64 MB pamięci. W niektórych przypadkach możesz chcieć mieć bardziej szczegółową kontrolę nad konfiguracją. Na przykład, powiedzmy, że port 11211 jest używany przez inny proces na twoim komputerze i chcesz, aby serwer Memcached używał portu 12000; lub jeśli uruchamiasz serwer Memcached w QA lub środowisku produkcyjnym, chciałbyś dać mu więcej pamięci niż domyślne 64 MB. W takich przypadkach można użyć opcji wiersza polecenia, aby dostosować zachowanie serwera. Wykonanie memcache.exe -helppolecenia spowoduje wyświetlenie pełnej listy opcji wiersza polecenia, takich jak te pokazane na rysunku 3.

Połącz się z Memcached przez Telnet

Po uruchomieniu serwer Memcached nasłuchuje na porcie, do którego go przypisałeś. Klient Memcached łączy się z serwerem przez port TCP lub UDP, wysyła polecenia i otrzymuje odpowiedzi, a ostatecznie zamyka połączenie. (Zobacz Zasoby, aby uzyskać szczegółowe informacje na temat protokołu używanego przez klienta do komunikacji z serwerem).

Możesz połączyć się z serwerem Memcached na różne sposoby. Jeśli używasz klienta Java, tak jak zrobimy to w drugiej połowie tego samouczka, będziesz mieć dostęp do prostego interfejsu API do przechowywania i pobierania obiektów z pamięci podręcznej. Alternatywnie można użyć klienta Telnet do bezpośredniego połączenia z serwerem. Umiejętność korzystania z klienta Telnet do komunikacji z serwerem Memcached jest ważna dla debugowania klienta Java, więc zaczniemy od tego.

Polecenia Telnet

Najpierw musisz użyć wybranego klienta Telnet, aby połączyć się z serwerem Memcached. Na komputerze z systemem Windows XP możesz po prostu wykonać, telnet localhost 11211zakładając, że serwer Memcached działa na tej samej maszynie i nasłuchuje na domyślnym porcie 11211. Poniższe polecenia są niezbędne do pracy z Memcached przez Telnet:

  • setdodaje nowy element do pamięci podręcznej. Wezwanie to: Set . W następnym wierszu możesz wpisać rzeczywistą wartość, która ma być przechowywana. Jeśli nie chcesz, aby pozycja pamięci podręcznej wygasła, wprowadź 0 jako wartość.
  • getzwraca wartość klucza pamięci podręcznej. Użyj, get aby uzyskać wartość keyName.
  • adddodaje nowy klucz tylko wtedy, gdy jeszcze nie istnieje. Na przykład:add
  • replacezamieni wartość tylko wtedy, gdy klucz istnieje. Na przykład:replace
  • deleteusuwa wpis pamięci podręcznej dla klucza. Możesz użyć wywołania, delete aby usunąć wartość keyName.

Zrzut ekranu na rysunku 4 przedstawia przykładową interakcję z serwerem Memcached za pośrednictwem usługi Telnet. Jak widać, serwer Memcached dostarcza informacji zwrotnej do każdego polecenia, takie jak STORED, NOT_STOREDi tak dalej.

Wniosek do części 1

Jak dotąd pokrótce omówiliśmy różnice między rozproszoną architekturą Memcached a bardziej tradycyjnymi systemami pamięci podręcznej Java. Skonfigurowaliśmy również implementację Memcached w Twoim środowisku programistycznym, a Ty poćwiczyłeś łączenie się z Memcached przez Telnet. W następnej części tego samouczka użyjemy klienta Java spymemcached do skonfigurowania rozproszonego rozwiązania buforowania dla przykładowej aplikacji Java. W trakcie tego procesu dowiesz się dużo więcej o Memcached oraz o tym, jak może poprawić wydajność aplikacji Java EE.

Sunil Patil jest architektem Java EE pracującym dla Avnet Technology w San Francisco w Kalifornii. Jest autorem Java Portlets 101 (SourceBeat, kwiecień 2007) i napisał wiele artykułów opublikowanych przez JavaWorld, IBM developerWorks i O'Reilly Media. Oprócz tego, że jest certyfikowanym programistą IBM WebSphere Portal Server Application Developer i administratorem, jest również certyfikowanym programistą Java firmy Sun Microsystems, programistą komponentów WWW i programistą komponentów biznesowych. Możesz przeglądać blog Sunila pod adresem //www.webspherenotes.com.