В классической реализации микросервисной архитектуры сервисы получают сообщение ибрабатывают его и выплючывают дальше (stateless). Вопросы разделения нагрузки и обеспечения отказоустройчивости решаются путем использования очередей и запуском нескольких экземпляров сервиса. Но на практике мы столкнулись с проблемой синхронизации.
Допустим мы имеем набор объектов которые описывают конечный автомат, состояния и переходы между состояниями. В настоящий момент мы имеем один сервис который отвечает за обработку переходов между состояниями для всех объектов. При переходе в новое состояние сервис отправляет сообщение другим микросервисам. При старте мы выгружаем все объекты из базы и запускаем конечный автомат.
Соответственно мы не может просто запустить 3 экземпляра сервиса - все три вычитают один и тот же набор объектов и будут выполнять одни и теже переходы - на выходе все три будут отправлять 3 одинаковых сообщения.
Отсюда ряд вопросов:
- Есть ли классические решения для данной проблемы?
- Если ли надежные механизмы синхронизации c использованием message bus (JMS подобной)?
- Есть ли класическик решения для балансировки и обеспечения отказоустойчивости statefull сервисов?