微服务中需要事务发件箱模式

Need for transacional outbox pattern on microservices

我看到了使用事务发件箱模式 (https://microservices.io/patterns/data/transactional-outbox.html) 的建议,用于在数据库发生某些更改后应将消息发布到代理的场景,因此它可以 "ACID" .我的问题是:为什么不把消息 publish inside 这样的交易?

try {
   beginTransaction()
   saveStuff()
   publishMessage() 
   commitTransaction()
} catch() {
   rollbackTransaction()
}

这样,只要消息发布失败,事务就会被回滚。我只看到一个问题:您可能不想在消息发布失败时回滚事务,稍后再试。这种方法还有其他问题吗?

publishMessage 可以工作(消息已发送)但 commitTransaction 可能会失败(例如与数据库的连接丢失或应用程序在发送消息后和调用提交之前崩溃)