Web Design Blog / Programowanie:

Pamięć podręczna aplikacji webowej

Data publikacji: 28 lutego 2019

Z pamięci podręcznej korzystamy w przypadku przetwarzania danych. Wykorzystywanie pamięci podręcznej jest techniką optymalizacyjną ponieważ mechanizm jej działania ma za zadanie skrócić czas wykonywana się operacji związanych (najczęściej) z odczytem.

Mechanizm pamięci podręcznej pojawił się w Informatyce stosunkowo szybko, bowiem niemal od początku istnienia systemów przetwarzających dane mieliśmy zawsze kilka rodzajów pamięci. Mam tu na myśli szybką pamięć RAM i stosunkowo wolną pamieć masową (np. dysk HDD). Często też dochodziło do sytuacji, w której raz uzyskane dane w wyniku pewnych obliczeń mogły być wykorzystywane kilkakrotnie.

Idea cache w codziennym życiu 🙂

Z resztą, z idei pamięci podręcznej wszyscy korzystamy na co dzień. Przykładowo, jeżeli wiemy, że z jakiegoś dokumentu będziemy często korzystać lub jakieś akcesorium często się nam przyda – jeżeli jest to możliwe i wygodne zostawiamy go sobie na biurku (a nie chowamy każdorazowo do szuflady).

Wykonujemy zdjęcia rozkładów, lub ważnych informacji do których i tak mamy dostęp z oryginalnego nośnika, tylko po to, by nie musieć do nich sięgać ponownie. Wpadamy na takie pomysły automatycznie chcąc zaoszczędzić sobie czas w przyszłości.

W jakich sytuacjach korzysta się z Cache?

W typowej aplikacji webowej mamy do wykorzystania tak naprawdę kilka różnych pamięci, w której możemy przechowywać dane do odczytu. Najczęściej wykorzystuje się bazę danych SQL oraz system plików.

Czas dostępu do tych danych zależy od wielu czynników. W przypadku aplikacji małej skali przechowywanie wszystkich danych w bazie MySQL będzie efektywne i nie doświadczymy problemów z długim czasem odpowiedzi. Można w tym wypadku zrezygnować z metod buforowania bo tylko skomplikują nasz system i będziemy mieli do czynienia z „przeinżynierowaniem” czyli w tym przypadku z optymalizacją, która skomplikuje system nie dając w zamian poprawy wydajności.

Baza MySQL ma swój natywny mechanizm cache, który w 99% wystarczy w przypadku aplikacji małej skali.

Jeżeli zaś danych jest coraz więcej lub pobiera je duża ilość konkurujących ze sobą użytkowników, czas oczekiwania może się znacząco wydłużyć. Co ciekawe, to nie jest tak, że wszystkie informacje zawarte w bazie są odczytywane z równą częstością. Niektóre fragmenty bazy czy systemu plików są odczytywane częściej (tzw. gorące dane) inne mniej (zimne).

Co więcej niektóre zapytania SQL lub złożone mechanizmy generujące dane (np. mechanizmy zliczania, raportowanie, prowadzenie rankingów) operują na dużej ilości danych, wykonując przy tym pewne obliczenia, na danych, które stosunkowo rzadko ulegają zmianie.

Zasada działania mechanizmu Cache

Cache polega na buforowaniu danych czyli przechowywaniu i wykorzystywaniu ich przez określony czas w pamięci podręcznej. Dzięki temu:

  • dane wygenerowane wskutek konkretnych operacji mogą zostać wykorzystane wielokrotnie bez ponownych obliczeń
  • dane mogą być przechowywane w pamięci o krótszym czasie dostępu

Jakość mechanizmu cache określamy poprzez Cache-Hit-Ratio. Jest to metryka informująca o tym ile razy udało się skorzystać z danych przechowywanych w pamięci Cache bez konieczności ich ponownej synchronizacji.

Korzyści wykorzystywania pamięci podręcznej

Pamięć podręczna to uniwersalny mechanizm zwiększający wydajność aplikacji lub jakiegokolwiek innego systemu przetwarzającego dane bez konieczności przebudowywania jego struktury.

  • radykalnie skraca czas dostępu do danych
  • niweluje wąskie gardła
  • i w konsekwencji podnosi wydajność całego systemu stosunkowo niskim kosztem

Pamięć podręczna przeglądarki

Jedno z takich rozwiązań, to pamięć podręczna protokołu HTTP, której specyfikacja znajduje się w dokumencie RFC 7234. Sterowanie pamięcią jest możliwe za pomocą nagłówków Cache-Control. Dzięki Cache-Control można określić dla każdego zasobu oddzielną politykę buforowania. Dyrektywy Cache-Control kontrolują, kto może buforować odpowiedź, w jakich warunkach i jak długo. Dzięki temu kolejne żądania nie będą wymagać komunikacji z serwerem co wyeliminuje czas oczekiwania na odpowiedź i odciąży serwer HTTP i serwer plików.

Przykładowo, Dyrektywa Cache-Control: max-age=3600 spowoduje, że przez 24 godziny przeglądarka będzie próbowała przechowywać kopię zasobu w swojej pamięci podręcznej i wszelkie żądania będzie kierowała do lokalnej kopii zasobu.

Sterowanie za pomocą nagłówka Cache-Control nie musi odnosić się wyłącznie do pamięci podręcznej przeglądarki ale także do: serwera pośredniczącego (proxy), odwrotnego serwera pośredniczącego (reverse proxy) oraz do sieci CDN.

Cache na poziomie aplikacji

Kolejnym typem pamięci podręcznej w aplikacji webowej jest Cache na poziomie aplikacji, który jest oddzielnym zbiorem danych i najczęściej występuje pod postacią tablicy asocjacyjnej (czyli zbioru typu klucz-wartość). Aktywne korzystanie z tego typu pamięci podręcznej oraz zarządzanie nią musi być zaprogramowane bezpośrednio w aplikacji.

Główną motywacją do tworzenia tego typu pamięci podręcznej jest oszczędność zasobów, które muszą zostać użyte aby zwrócić dany obiekt. Przykładowo, oczekiwanie na odpowiedź z baz MySQL może trwać stosunkowo długo, buforując tego typu dane można radykalnie skrócić czas odpowiedzi o ile częstotliwość potrzeby odczytania tych danych znacznie przewyższa częstotliwość ich aktualizacji. Buforowane obiekty też mają swoje daty wygasania i jest możliwe unieważnienie i odtworzenie ich na nowo.

Pamięć taka może być przechowywana po stronie klienta (np. za pomocą localStorage – pamięci na urządzeniu klienckim wprowadzonej w HTML5), po stronie serwera, lub na osobnej maszynie z wyspecjalizowanym oprogramowaniem (np. Redis) a nawet w całkiem niezależnej, skalowalnej sieci pod postacią wyspecjalizowanych zewnętrznych usług chmurowych (np. usługa Amazon ElastiCache).

W celu minimalizacji czasu dostępu do danych, nośnikiem w tego typu rozwiązaniach może być nawet pamięć operacyjna serwera, która charakteryzuje się krótszym o kilka rzędów czasem dostępu do danych z powodu bezpośredniego (a nie sekwencyjnego) dostępu do komórek pamięci.

Źródła

[Hypertext Transfer Protocol (HTTP/1.1): Caching, IETF, 2014, dostępne: luty 2019,  https://tools.ietf.org/html/rfc7234#section-5.2.3

Cache-Control – HTTP | MDN, Dokumentacja MDN, 2018, dostępne: luty 2019, https://developer.mozilla.org/pl/docs/Web/HTTP/Headers/Cache-Control

Buforowanie HTTP, Google Developers, 2019, dostępne: luty 2019, https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=pl

In-Memory Processing in the Cloud, AWS, 2018, dostępne: luty 2019, https://d1.awsstatic.com/elasticache/elasticache_in_memory_processing_intel.pdf

Pamięć podręczna aplikacji webowej Pamięć podręczna aplikacji webowej 4.4 na 5 na podstawie 9 ocen Pamięć podręczna aplikacji webowej


Komentarze

Brak komentarzy.

Dodaj swój komentarz