Ответ 1
RabbitMQ рекомендует вам использовать подтверждения издателя, а не транзакции. Сделки не работают хорошо.
В любом случае транзакции обычно не очень хорошо работают с сервис-ориентированной архитектурой. Лучше принять подход "в конечном счете последовательный", когда отказ может быть повторен позже, а дублированные сообщения идемпотента игнорируются.
В вашем примере я бы сделал обновление базы данных и зафиксировал ее перед публикацией сообщения. Когда издатель подтвердит возврат, я бы обновил поле в записи базы данных, чтобы указать, что сообщение было отправлено. Затем вы можете запустить процесс подметания, проверить наличие неотправленных сообщений и отправить их на своем пути. Если сообщение прошло, но по какой-либо причине подтверждение или последующая запись базы данных не удались, вы получите дублирующее сообщение. Но это не имеет значения, потому что вы разработали свои сообщения как идемпотентные.