Кейс: локальный кэш показывал разные данные на разных подах

Сервис держал Caffeine-кэш на уровне JVM для справочника тарифов — обновляется редко, читается на каждый запрос, поход в БД казался лишним. После правки тарифа в админке часть пользователей видела новую цену, часть — старую, и это не зависело от времени суток.

Причина — кэш локальный для каждого инстанса. Обновление тарифа писало в БД и инвалидировало кэш на том поде, который принял запрос от админки. Остальные три пода в кластере продолжали отдавать старое значение до истечения TTL, выставленного на шесть часов.

Локальный кэш ускоряет чтение, но у него нет механизма разослать инвалидацию соседям — это не Redis с единым состоянием, это N независимых копий одних и тех же данных.

Решили через Kafka-топик с событием invalidate-tariff: каждый под подписан и сбрасывает свою запись Caffeine при получении события, независимо от того, кто из подов принял исходное изменение.

Спросят следом: почему не сократили TTL вместо event-based инвалидации. Короткий TTL снижает окно неконсистентности, но не убирает его и увеличивает нагрузку на БД пропорционально частоте обновления — это компромисс, а не решение первопричины.

Локальный кэш в кластере из нескольких подов — это несколько разных кэшей, а не один.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки