To pytanie dotyczy najlepszych praktyk w architekturze.
Nasza obecna architektura
Mam klasę PHP, która uzyskuje dostęp do MySQL w celu uzyskania informacji o użytkowniku. Nazwijmy to User
. User
jest uzyskiwany wielokrotnie, dlatego zaimplementowaliśmy warstwy buforowania, aby zmniejszyć obciążenie.
Pierwsza warstwa to pamięć podręczna „na żądanie”. Po pobraniu danych z MySQL przechowujemy je w prywatnej własności User
. Wszelkie kolejne żądania danych zwracają właściwość zamiast ponownie żądać danych z MySQL.
Ponieważ żądanie sieciowe żyje i umiera na zasadzie na żądanie, ta pamięć podręczna uniemożliwia aplikacji dostęp do MySQL więcej niż raz w jednym żądaniu.
Nasza druga warstwa to Memcached. Gdy własność prywatna jest pusta, najpierw sprawdzamy dane Memcached. Jeśli Memcached jest pusty, pytamy MySQL o dane, aktualizujemy Memcached i aktualizujemy prywatną własność User
.
Pytanie
Nasza aplikacja jest grą i czasami konieczne jest, aby niektóre dane były jak najbardziej aktualne. W ciągu około pięciu minut żądanie odczytu danych użytkownika może nastąpić 10 lub 11 razy; wtedy może wystąpić aktualizacja. Kolejne żądania odczytu muszą być aktualne, inaczej mechanika gry zawiedzie.
Tak więc, co zrobiliśmy, to zaimplementowanie fragmentu kodu, który jest wykonywany, gdy nastąpi aktualizacja bazy danych. Ten kod ustawia klucz w Memcached ze zaktualizowanymi danymi, więc wszystkie kolejne żądania do Memcached są aktualne.
Czy to jest optymalne? Czy są jakieś obawy związane z wydajnością lub inne „problemy”, o których powinniśmy pamiętać, próbując utrzymać coś w rodzaju „żywej pamięci podręcznej”?