是否可以定义一个将处理许多消息的传奇

Is it possible to define a single saga which will process many messages

我的团队正在考虑我们是否可以使用公共交通作为 RabbitMq 中 sagas 的主要解决方案(相对于 NServiceBus)。我承认我们对 masstransit 和 nserviceBus 等解决方案的经验很少,我们已经开始将消息传递引入我们的系统。所以如果我的问题很简单甚至很愚蠢,我很抱歉。 但是,当我查看公共交通文件时,我注意到我不确定这是否可以解决我们的一个案例。

案例如下: 我们的组件之一将生成多达 100 条消息,这些消息将 "sent" 排队。这些消息是系统中单个操作的结果。所有消息都将具有相同的相关 ID 和我们的内部发布 ID(也相同)。

1) 是否可以定义一个单一实例 saga(通过相关 ID),它会一直等到它从队​​列中接收到所有消息,然后将它们作为一个批次处理?

2) 否则,是否有任何解决方案可以确保所有发送的消息都得到处理? (一致性批次?)我假设相关的 Id 将用作找到现有传奇实例(单例)的方法。在理想情况下,我想完成一个 saga 的实例,当系统将处理属于一个组(一个发布)的每条消息时

我也查看了 CompositeEvent,但我不确定是否可以使用它来 "ensure" 每条消息都已处理,然后我会为特定的相关 ID 完成传奇。

你能解释一下它是如何实现的吗?为了将具有相同 id 的大量消息与单个 saga 相关联,然后在所有 msg 都被消耗时完成,我应该研究什么机制?

提前感谢您的任何回复

接收一系列消息然后批量操作它们的能力很常见,以至于有一个示例展示了如何做到这一点:

Batch Sample

每个 saga 实例都有一个唯一的相关标识符,只要这些消息可以与该单个实例相关联,MassTransit 就会管理并发性(乐观或悲观,取决于 saga 存储引擎)。

我建议查看示例中的状态机,看看它与您的场景相比如何。

您描述的是 ID 关联的工作原理。开箱即用。

所以,简而言之 - 当您正确配置消息的相关性时,具有相同相关性 ID 的所有消息都将由同一个 saga 实例处理。

关于第二个问题 - 除非你发布一个单独的事件来通知 saga 它应该如何接收消息,否则它怎么知道的?你绝对可以安排一个很长的超时时间,尝试并假设在超时时间内所有的消息都会被 saga 接收到,但这并不可靠。

复合事件在这里无济于事,因为它们适用于不同类型的消息,当所有消息都到达时,它们将作为 一个 处理,并且不计入消息的数量每种类型的消息。它只等待每种类型的一条消息。