Вопрос объясняет решение проблемы согласованности данных.
Используйте Transactional Outbox:
Сохраняйте событие в БД в той же транзакции.
Отправляйте в RabbitMQ через фоновый процесс.
Шаги реализации:
Локальная транзакция:
@Transactional
public void processOrder(Order order) {
orderRepository.save(order);
outboxRepository.save(new OutboxEvent("order_created", order.getId()));
}Фоновый процесс:
Отправляет события из outbox в RabbitMQ.
Удаляет записи после успешной отправки.
Альтернатива:
Подтверждение транзакции (если БД и RabbitMQ поддерживают XA-транзакции).