С какими проблемами можно столкнуться при горизонтальном масштабировании микросервиса
Что проверяют
Понимаете ли вы, что реплики добавить легко, а упирается всё в то, что вокруг сервиса: состояние, база, внешние лимиты, фоновые задачи. Вопрос открытый, по нему видно, доводили ли вы сервис до нескольких инстансов или читали про это.
Как отвечать
Идите по слоям, от самого сервиса наружу:
- состояние в памяти. Локальный кэш, счётчики лимитов, сессии, загруженные файлы. С одной репликой работало, с пятью пользователь попадает каждый раз в другую. Всё общее выносится в Redis или базу, сервис становится stateless;
- база. Пул соединений умножается на число реплик и на число воркеров: десяток подов, по четыре воркера
gunicorn, пул по двадцать соединений, и вот уже почти тысяча коннектов, которых Postgres не выдержит. Лечится внешним пулером и уменьшением локального пула; - фоновые задачи. Всё, что сервис делал по расписанию внутри себя, после масштабирования выполняется в каждой реплике. Нужен распределённый лок или вынос в отдельный воркер в единственном экземпляре;
- повторы. Ретрай балансировщика по таймауту создаёт второй заказ, поэтому запись обязана быть идемпотентной по ключу;
- внешние ограничения. Квота стороннего API, блокировки в базе, один шард на запись: масштабирование переносит узкое место, а не убирает его.
Закончите наблюдаемостью: сквозной идентификатор запроса в логах и трассировка, иначе разбор инцидента на десяти репликах превращается в гадание.
Где спотыкаются
Масштабируют сервис и упираются в базу. Реплики дешёвые, а мастер один, и без разговора про соединения и блокировки ответ выглядит теоретическим.
Второе: забывают про локальное состояние. Счётчик частоты запросов, живущий в памяти процесса, при десяти репликах пропускает в десять раз больше, чем задумано, и замечают это обычно по счёту от стороннего API.
Третье: путают масштабирование с асинхронностью. Блокирующий вызов внутри обработчика не чинится добавлением подов: в асинхронном приложении он держит событийный цикл, и новые реплики просто тиражируют ту же проблему.