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