Концептуально, я полагаю, что вы, возможно, полагаетесь на RabbitMQ, чтобы делать то, что нужно вашему приложению.
Предполагается, что архитектура предполагает, что каждое сообщение обрабатывается каждым из ваших приложений-потребителей полностью в вакуум. Это означает, что вам все равно, что сообщение, успешно обработанное Billing_App
, в итоге завершилось неудачей с Inventory_App
. Может быть, это и так, но, по моему опыту, это не так.
Если конечной целью является достижение какого-либо согласованного состояния в общих данных, вам понадобится какой-то надзорный компонент, организующий и контролирующий различные операции для обеспечения согласованности состояния. По сути, это означает, что ваше заявление об отклонении сообщения обратно в RabbitMQ означает, что у вас есть немного больше мыслей о том, что происходит в случае сбоя.
Я бы сосредоточился на выявлении некоторых диаграмм действий UML, которые описывают ваше поведение и то, как оно достигает конечного состояния, и используйте его как руководство, чтобы определить, как должна быть разработана оркестровка вашего приложения.