是否可以定义一个将处理许多消息的传奇
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 都被消耗时完成,我应该研究什么机制?
提前感谢您的任何回复
接收一系列消息然后批量操作它们的能力很常见,以至于有一个示例展示了如何做到这一点:
每个 saga 实例都有一个唯一的相关标识符,只要这些消息可以与该单个实例相关联,MassTransit 就会管理并发性(乐观或悲观,取决于 saga 存储引擎)。
我建议查看示例中的状态机,看看它与您的场景相比如何。
您描述的是 ID 关联的工作原理。开箱即用。
所以,简而言之 - 当您正确配置消息的相关性时,具有相同相关性 ID 的所有消息都将由同一个 saga 实例处理。
关于第二个问题 - 除非你发布一个单独的事件来通知 saga 它应该如何接收消息,否则它怎么知道的?你绝对可以安排一个很长的超时时间,尝试并假设在超时时间内所有的消息都会被 saga 接收到,但这并不可靠。
复合事件在这里无济于事,因为它们适用于不同类型的消息,当所有消息都到达时,它们将作为 一个 处理,并且不计入消息的数量每种类型的消息。它只等待每种类型的一条消息。
我的团队正在考虑我们是否可以使用公共交通作为 RabbitMq 中 sagas 的主要解决方案(相对于 NServiceBus)。我承认我们对 masstransit 和 nserviceBus 等解决方案的经验很少,我们已经开始将消息传递引入我们的系统。所以如果我的问题很简单甚至很愚蠢,我很抱歉。 但是,当我查看公共交通文件时,我注意到我不确定这是否可以解决我们的一个案例。
案例如下: 我们的组件之一将生成多达 100 条消息,这些消息将 "sent" 排队。这些消息是系统中单个操作的结果。所有消息都将具有相同的相关 ID 和我们的内部发布 ID(也相同)。
1) 是否可以定义一个单一实例 saga(通过相关 ID),它会一直等到它从队列中接收到所有消息,然后将它们作为一个批次处理?
2) 否则,是否有任何解决方案可以确保所有发送的消息都得到处理? (一致性批次?)我假设相关的 Id 将用作找到现有传奇实例(单例)的方法。在理想情况下,我想完成一个 saga 的实例,当系统将处理属于一个组(一个发布)的每条消息时
我也查看了 CompositeEvent,但我不确定是否可以使用它来 "ensure" 每条消息都已处理,然后我会为特定的相关 ID 完成传奇。
你能解释一下它是如何实现的吗?为了将具有相同 id 的大量消息与单个 saga 相关联,然后在所有 msg 都被消耗时完成,我应该研究什么机制?
提前感谢您的任何回复
接收一系列消息然后批量操作它们的能力很常见,以至于有一个示例展示了如何做到这一点:
每个 saga 实例都有一个唯一的相关标识符,只要这些消息可以与该单个实例相关联,MassTransit 就会管理并发性(乐观或悲观,取决于 saga 存储引擎)。
我建议查看示例中的状态机,看看它与您的场景相比如何。
您描述的是 ID 关联的工作原理。开箱即用。
所以,简而言之 - 当您正确配置消息的相关性时,具有相同相关性 ID 的所有消息都将由同一个 saga 实例处理。
关于第二个问题 - 除非你发布一个单独的事件来通知 saga 它应该如何接收消息,否则它怎么知道的?你绝对可以安排一个很长的超时时间,尝试并假设在超时时间内所有的消息都会被 saga 接收到,但这并不可靠。
复合事件在这里无济于事,因为它们适用于不同类型的消息,当所有消息都到达时,它们将作为 一个 处理,并且不计入消息的数量每种类型的消息。它只等待每种类型的一条消息。