NServiceBus和系统集成:如何正确处理消息?

时间:2014-09-03 10:52:54

标签: nservicebus

我正在使用利用MSMQ传输层的NServiceBus集成两个(以及将来可能超过两个)系统。 我需要支持几种业务对象类型的同步(特别是从两个端点侧对这些对象进行创建,更新,删除事件)。 我正在使用Pub / Sub消息传递模式。

NSB消息传输有关创建,更新和删除业务对象的信息。服务总线应禁用更新或删除特定端点系统中不存在的对象。

让我们考虑以下情况。在Endpoint1中按以下顺序发布消息:

[Message1]: "create business object A"
[Message2]: "update business object A"
[Message3]: "delete business object A"

问题1:我们不知道Endpoint2将以哪种顺序(a)接收入站队列和(b)处理上述消息,我是对的吗?

问题2:如果在Endpoint2中无法正确处理Message1,它将被放回队列中,其他消息将被首先处理,我是对的吗?

问题3:在这种情况下,由于尝试对不存在的对象进行操作,Message2和Message3最终会出错。那我该如何处理Message2和Message3呢?我应该使用传奇吗?

问题4:另一个问题:如果有多个"更新对象A"消息 - 如何确保/强制将最后一个作为最后一个处理?

1 个答案:

答案 0 :(得分:2)

  

问题1:我们不知道Endpoint2将以(a)接收的顺序   到入站队列和(b)处理上述消息,我是对的吗?

正确。也就是说,根据您希望生成这些消息的距离越来越近,它可能是非常可能的,它们很可能不会被无序接收和处理。

  

问题2:如果在Endpoint2中无法正确处理Message1   将被放回队列中,其他消息将被首先处理,   我是对的吗?

将立即根据配置尝试 x 次数(我认为默认值为5),然后将回退到二级重试次数,这将允许处理其他消息消息被推迟。

  

问题3:在这种情况下,Message2和Message3最终会出错   因为尝试对不存在的对象进行操作。我该怎么办?   处理Message2和Message3然后?我应该使用传奇吗?

Sagas绝对是一个可能的选择。工作流程是否正确创建=> update =>删除?可以有多个更新吗?删除总是会发生吗? Sagas通常用于建模固定/已知的工作流程,因此根据您的具体情况,这可能是也可能不是最佳选择。

  

问题4:另一个问题:如果有多个"更新对象A"   消息 - 如何确保/强制将最后一个处理为   最后一个?

执行更新并发布它们的端点可能需要在消息上放置版本号(对于该实体实例),并且订户可能必须确保按顺序处理消息。或者,订户可能不得不丢弃具有比最后处理的版本号更低的版本号的消息。这取决于每个更新是过渡还是代表完全覆盖状态。在任何情况下,订阅端点都必须通过在本地存储版本号来以某种方式管理它。

最重要的是,所有这些都取决于您的具体情况,您希望如何发布消息,以及消息无序处理的后果。例如,您希望在99.999%的情况下将消息发布得足够远,这些都不重要,我不建议花费很多精力。

如果这些确实是罕见的情况,明智地使用Bus.Defer()可能足以理顺消息排序。

我假设您将此问题视为一般性问题而不是特定情况,但如果您确实遇到了您要解决的特定问题,我建议您将特定方案发布到{{3} - 社区通常非常有帮助。