@jar3b

Как правильно обрабатывать disconnect в микросервисах?

Ситуация: есть какое-то количество микросервисов, допустим 20, используется Docker (swarm mode). В них идут подключения (и точечные, и постоянные) к другим сервисам (базы данных, брокеры MQ, и т.д.).
Вопрос: как обрабатывать ошибки соединений с другими сервисами?
Варианты:
1. Пытаться переподключиться, это имеет смысл, если соединение постоянное, если "по требованию", то можно реализовать счетчик неудачных попыток и потом принимать меры. Тут проблема для меня в том, что логику реконнекта нужно будет реализовывать отдельно для каждого сервиса (Mongo, Elastic, Postgres, Nats, etc) и, возможно, на разных ЯП.
2. Сразу выходить, то есть завершать работу контейнера, без всяких реконнектов и docker должен сам перезапустить сервис. Тут вижу такую проблему: при массовом обновлении (допустим, обновилась версия образа DB) будет очень много рестартов, на это уходит время, и, возможно, было бы быстрее пытаться переподключиться (п. 1). Предполагаю, что и другие проблемы могут возникнуть.
3. Еще какой-то вариант.
  • Вопрос задан
  • 67 просмотров
Решения вопроса 1
@sah4ez32
software engineer
2й вариант однозначно.
Для swarm режима есть опции (точно не вспомню название) которая позволяет обновлять сервисы не все разом, а частями (например репликаций 5, то можно обновлять по 2). Плюс есть вроде тайм-аут для этого дела. Посмотрите что-то из докладов Аруна Гупта про swarm, очень хорошо рассказывает.
Также в пользу 2ого варианта, простота приложения. Не надо городить счётчики и прочее. Единственное, если в сервисе есть какое-то состояние, можно делать 1 попытку реконнекта и потом падать.
Плюсом этого подхода будет наглядность при деградации какого-то сервиса. Условно, упала база упадут и все сервисы с ней работающие и это будет заметно. А если реконнект внутри сервиса, то это уже не будет наглядно и надо будет дебажить и лезть в логи.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы