Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Memcache i sekcja krytyczna
Forum PHP.pl > Forum > PHP
dynast
Niech istnieje strona o dużej liczbie użytkowników oraz pewien zasób w Memcache o danym kluczu. Za cache znajduje się jedna baza danych z której, w przypadku braku cache lub jego nieważności, przez odwiedzającego usera zostaną pobrane dane do cache.
W sytuacji kiedy ważność danych dla naszego klucza wygasa, może dojść do wyścigu pomiędzy odświeżającymi stronę userami, wszyscy jednocześnie będą starali się odświeżyć cache (czas wyciągania danych z bazy jest krótki ale nie aż tak krótki aby go zupełnie pominąć). Aby do tego nie dopuścić trzeba mieć pewien mechanizm synchronizacji pozwalający tylko jednemu użytkownikowi (lub małej ich ilości) odświeżyć cache.

No i pytanie, jak? Na pewno struktury IPC jądra Linux odpadają, nie ma jednej przestrzeni adresowej jądra bo jest kilka serwerów aplikacji. Mechanizmy GET_LOCK() z MySQL wariują trochę za bardzo (pconnect lub SQLRelay). Implementacja w Memcache także nie zawsze działa, aczkolwiek jest w miarę stabilna:
1. Utwórz zasób blokadę metodą add()
2. Zablokuj wszystkie inne wątki próbujące go utworzyć (add() teoretycznie pozwoli zrobić to tylko raz, praktycznie nie zawsze)
3. Odśwież cache
4. Usuń zasób remove()
5. Korzystaj z cache

Czy ktoś spotkał się z tym problemem, i zna jakąś przetestowaną implementację?
Pepis
Zakładasz LOCK w momencie gdy sprawdzasz czy cache istnieje i czy nie jest "przeterminowany" (zmienna zapisana w memcache, na początku egzekucji).
Jeśli cache nie istnieje i założony jest LOCK, wszyscy inni użytkownicy czekają na wygenerowanie/pobranie danych (while sleep).
Jeśli cache istnieje i jest przeterminowany oraz ktoś inny założył lock wtedy wszyscy inni użytkownicy dostają przeterminowany cache.
Na koniec musisz zdjąć LOCK.

Przy krótkich czasach generowania cache nie ma co zakładać LOCK.

LOCK zakładasz tylko podczas generowania.

Powodzenia
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.