我正在使用利用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"消息 - 如何确保/强制将最后一个作为最后一个处理?
答案 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} - 社区通常非常有帮助。