我是否需要 Saga 来确保始终处理消息?

Do I need a Saga to ensure a message is always processed?

当我的 Sales 微服务完成销售时,我的 Order 微服务 必须 创建订单.当发生这种情况时,SaleCompleteEvent 被提升到总线上供订单服务使用。

但是,Sales 服务不需要等待 Order 服务,在某些情况下,即使在创建订单时有明显的延迟,也不会有这样的问题。

因此,如果订单创建失败,则使用 Saga 回滚销售似乎有点过分了。相反,我只是希望 Order 服务继续尝试并确保没有消息在总线上丢失(即使它在灾难中崩溃)。

重试很容易,但我正在尝试研究如何确保总线消息永远不会丢失。如果我把精力集中在这方面(必须发生某些事情,但不需要像事务一样回滚之前的步骤),我们还会称其为 Saga 模式吗?或者它有我可以用来研究的另一个名字吗?

这种 'rely on the bus to always recover the message in failure' 方法在实践中是否可行,或者我是否总是需要一些东西来观察并在出现问题时引发新的 SaleCompleteEvents?

我认为您的用例不需要传奇。如果创建订单失败是由临时问题(例如网络故障)引起的,那么重试是一种自然的策略。 我现在将尝试回答正文中的问题,但我需要对它们进行一些解释:

Retrying is easy, but I'm trying to research how I would go about making sure a bus message is never lost

我想您的需求是消息不会被“遗忘”,以防由于某种原因处理失败。消息总线通常提供确认功能(这是您的关键字)来实现这一点:总线消费者接收消息,处理它,如果成功,它会确认消息,因此总线知道可以丢弃该消息。在消费者 failure/crash 的情况下,永远不会发送确认信号,结果是总线在超时后将使消息可以再次被拾取。

Is this 'rely on the bus to always recover the message in failure' approach even feasible in practice, or do I always need something to watch and raise new SaleCompleteEvents if something goes wrong?

从事件库系统的角度来看,多次发送同一个事件是错误的,这显然是您正在构建的系统。 SaleCompleteEvent 之类的东西应该跟踪在您的域中发生的事件,并且显然相同的销售仅完成一次。发送两次会创建您域的虚假历史记录。