Как реализован функционал работы с Redis: в отдельном микросервисе или в составе другого сервиса
Что проверяют
Понимаете ли вы, где проходит граница между инфраструктурой и сервисом. Redis это хранилище, как PostgreSQL, и прятать его за отдельным микросервисом обычно незачем. Следом часто спрашивают, как сервис переживёт недоступность Redis и как вы защищаетесь от лавины промахов кэша.
Как отвечать
Разведите понятия: Redis в любом случае отдельный процесс, и запрос к нему идёт по сети. Выбор на самом деле между «каждый сервис ходит в Redis своим клиентом» и «есть кэш-сервис с gRPC API, через который ходят остальные». Второй вариант добавляет сетевой прыжок, сериализацию и ещё одну точку отказа, поэтому по умолчанию правильный первый.
Как это выглядит в Go-сервисе:
- клиент:
github.com/redis/go-redis/v9илиrueidis, если нужен кэш на стороне клиента. Клиент создаётся один раз, внутри у него пул соединений, размер которого по умолчанию зависит отGOMAXPROCS; - граница: в доменном слое объявлен маленький интерфейс вроде
type SessionStore interface, реализация на Redis лежит в пакете инфраструктуры. В тестах её подменяют фейком илиminiredis; - контекст: каждый вызов принимает
context.Contextс дедлайном, а в клиенте выставленыDialTimeout,ReadTimeout,WriteTimeout; - промахи: отсутствие ключа приходит ошибкой
redis.Nil, её проверяют черезerrors.Isи отличают от сетевой ошибки; - лавина: одновременные промахи по одному ключу схлопывают через
golang.org/x/sync/singleflight, а TTL разбрасывают случайным сдвигом.
Отдельный сервис оправдан, когда у него своя предметная область: rate limiter на всю платформу, сессии, блокировки с понятным API. Тогда он владеет данными, а не проксирует GET и SET.
Где спотыкаются
Говорят, что встроенный в сервис Redis «работает локально». Сеть есть всегда, выделенный сервис просто добавляет второй прыжок.
Считают redis.Nil аварией и отдают 500 там, где нужно сходить в базу и заполнить кэш.
Пускают все сервисы в один Redis с общими ключами. Это общая база под другим названием: форматы нельзя менять независимо, а один шумный сервис вытесняет чужие данные.