Неуспех на многослойно кеширане
Добавихме L1, L2 и L3 кешове за "по-добра производителност." Сега имаме 3 места, където данните могат да бъдат грешни вместо 1.
Нашата брилянтна архитектура:
- L1: In-process кеш (Guava)
- L2: Локален Redis
- L3: Разпределен Redis клъстер
- Източник на истина: PostgreSQL
Какво се обърка:
- L3 кешът се инвалидира правилно
- L2 кешът все още имаше стари данни (различен TTL)
- L1 кешът на сървър A имаше стари данни
- L1 кешът на сървър B имаше нови данни
- Потребителите виждаха различни данни при всяко опресняване
Ад на дебъгването:
"Кой кеш слой има лошите данни?" ставаше 2-часово разследване всеки път.
Какво научихме:
- Всеки кеш слой умножава сложността на инвалидиране
- TTL-овете трябва да са координирани (вътрешен кеш < външен кеш)
- Нужна е наблюдаемост във всеки слой
- Понякога един кеш е достатъчен
Урок: Повече кеш слоеве ≠ по-добра производителност. Означава повече места за дебъгване когато нещата се объркат.