【问题标题】:Is it possible to define a single saga which will process many messages是否可以定义一个处理许多消息的saga
【发布时间】:2020-05-04 13:20:32
【问题描述】:

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

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

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

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

我也查看 CompositeEvent,但我不确定是否可以使用它来“确保”处理每条消息,然后我会让完成特定相关 Id 的 saga。

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

提前感谢您的任何回复

【问题讨论】:

    标签: masstransit saga


    【解决方案1】:

    您描述的是 id 相关性的工作原理。开箱即用。

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

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

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

    【讨论】:

      【解决方案2】:

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

      Batch Sample

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

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

      【讨论】:

        猜你喜欢
        • 2021-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-06
        相关资源
        最近更新 更多