Допустим, есть микросервис1(мк1) и микросервис2(мк2), есть сервер сообщений rabbitmq(mq). Мк1 предоставляет апи, которое пишет в бд мк1 данные. После записи мк1 один должен отправить сообщение мк2. И тут вопросы:
- как быть, если мк2 лежит?
- как быть, если mq лежит?
Предполагаю, что мк1 должен при не отвечающем mq записать сообщение куда-то в базу, а потом какой-то воркер должен чекнуть то, что mq поднялся и отправить сообщение и удалить его из списка локальных сообщений. Но просто вот по этой логике(если mq лежит, то записываем сообщение локально, если не лежит - тогда отправляем) делать нельзя. Потому как тут появится такое событие:
- запрос1 выполнен: пытаемся отправить сообщение1
- mq лежит? Да!
- записываем сообщение1 в базу мк1(самого себя), чтобы отправить позже
- запрос2 выполнен: пытаемся отправить сообщение2
- mq лежит? Нет!
- отправляем сообщение2
- периодик воркер срабатывает и отправляет сообщение1
В итоге мы получаем, что сообщение2 отправлено быстрей, чем сообщение1. Это не правильно
А как вообще правильно выстраивать систему отправки сообщений, чтобы это всё правильно работало?