在 NServiceBus 中,如何防止同时处理同一资源的多条消息?

In NServiceBus how can I prevent multiple messages for the same resource being processed concurrently?

我们有一个 NServiceBus 端点,它当前侦听 ProductChanged 事件并将其中的一些更改传达给第三方。

由于我们需要处理的事件量很大,我们已经扩展到多个节点,每个节点都有多个逻辑处理器,但已经开始 运行 出现一个问题,即同时处理指向同一产品的多条消息造成第三方系统冲突

到目前为止,我们只使用了 NServiceBus 的基本消息传递功能,哪些功能没有允许我们“锁定”特定产品 ID,以便当前正在接收的产品的任何传入消息正在处理,是被丢弃还是排队等候稍后重试?

阅读 https://docs.particular.net/nservicebus/sagas/concurrency 似乎 Sagas 可以做到这一点,但我不是 100% 确定这一点,无论如何我觉得它对这种情况来说可能有点过分了?

我们正在使用 SQL 传输,NSB v6


澄清一下问题:虽然我们可以同时处理任意数量的消息,但我们不能同时处理具有相同产品 ID 的两条消息

当需要按发送顺序处理消息并且一次处理一条消息时,假设消息按逻辑分组,Message Sessions 是服务总线提供的功能来完成这项工作。接收方仍然可以横向扩展并同时处理多个会话,但在任何给定会话中,一次只会处理一条消息。

很遗憾,NServiceBus 不支持会话。 Sagas soul 允许您完成工作,但实际上会使解决方案混乱,因为您必须将所有传入消息存储在 saga 的数据(状态)中,并依赖超时来执行这些消息。如果您有少量消息,以其自己的方式并没有那么糟糕。但是如果消息的数量很大或者它们的有效负载很大,saga 就会成为一个痛点而不是解决方案。

如果您希望在服务总线传输中支持消息会话,您可以对功能请求投赞成票here