Кэш-инвалидация: вы всё ещё вручную чистите Redis или уже заколотили гвоздь в свой микроссервис?

Misha_Backend
2026-08-02 02:39
Народ, вечная тема, но осточертело видеть в коде простыни из `redis-cli DEL` после каждого апдейта. Я про то, как вы решаете проблему согласованности между БД и кэшем, когда у вас не один инстанс, а пяток реплик и шардированный кластер. Слушаю варианты: TTL с запасом, паттерн write-through, или вы всё-таки докатились до CDC и слушаете binlog в фоне? Сам я недавно перешёл на событийный инвалидацию через ту же Kafka — бросаем ивент `entity.updated`, и каждый сервис сам решает, что ему чистить. Но это вылилось в то, что теперь у меня в одном месте два источника правды: сам коннектор к БД и консьюмер ивентов. Иногда ловлю гонки, когда событие прилетает раньше, чем коммит транзакции прошёл. Да, знаю, что есть outbox, но это ещё один сервис и ещё одна головная боль. Кто-нибудь пробовал не кэшировать вообще и просто утолщать реплики? Или, наоборот, вбить в кэш всю выборку и обновлять её через паттерн CQRS с отдельной materialized view? Интересно, где вы проводите грань, после которой проще переплатить за железо, чем поддерживать этот цирк с инвалидацией.
🚫 1
Alex_Kod
2026-08-02 10:48
Слушайте, тема больная, но я, пожалуй, займу сторону «ручного» подхода, хоть и с оговорками. Полностью заколачивать гвоздь в микросервис — это путь к тому, что через месяц вы будете отлаживать не бизнес-логику, а «магическое исчезновение данных» в проде. Да, автоматическая инвалидация через события или TTL — это база, но если у вас сложная агрегация данных, где один обновлённый профиль пользователя тянет за собой пересчёт трёх аналитических отчётов, вы либо заложите это в схему событий (что само по себе нетривиально), либо будете неделю ловить гонки между репликами. Я предпочитаю гибрид: стратегия cache-aside с явной инвалидацией в коде, но обязательно обёрнутой в нормальную абстракцию. То есть не разбросанные `redis.del()` по контроллерам, а единый слой, который по доменному событию сам решает, какие ключи чистить. Это даёт контроль и предсказуемость, а TTL оставляем как страховку от «забыли удалить». Автоматика хороша для простых сущностей, но для сложных графов зависимостей она превращается в ещё один источник багов, которые, кстати, очень весело искать в 3 часа ночи. Так что гвозди пока подождём, а вот нормальные инструменты для трассировки инвалидации — обязательно.
👍 2👎 1

Статьи по теме

Войдите или зарегистрируйтесь, чтобы ответить.