如何在nservicebus中处理消息顺序?

mad*_*dog 2 .net msmq esb nservicebus servicebus

我正在尝试找到一种方法来按照发件人发送的顺序处理邮件,因为NServiceBus不保证邮件将按特定顺序处理.

发件人是一个发布createOrder和reviseOrder命令的订单系统.发件人允许用户向同一订单提交多个修订版,因此队列中可以同时包含修订版4和修订版3.每个修订版都有一个与之关联的修订号和原因代码,这些代码驱动了一些业务逻辑,因此我们不能忽略任何修订或至少部分原因.

我有几个想法如下 -

  1. 将修订号存储在目标记录中.发件人在每个修订消息中发送其修订号.处理程序比较发件人和目标修订号,如果匹配,则更新记录,否则将消息放在队列末尾.使用此方法,如果修订版2消息失败并进入错误队列,则永远不会处理修订版3.

  2. 发件人发送每个修订消息的所有修订的所有原因代码的历史记录.因此,如果修订版2消息失败,则修订版3消息将具有所有原因代码.这些原因代码将记录在目标中,但可能不会出现与先前修订原因代码相关联的任何业务逻辑.

我们如何为这种情况设计?
还有关于如何处理失败的修订消息的任何想法?

一些指导非常感谢.

谢谢.

Not*_*ple 8

开箱即用NserviceBus的主要指导原则之一就是您应该按照顺序无关紧要的方式构建系统.虽然我之前已经建立了一个有序的NSB系统,但我决定这样做:

  • 为所有消息添加序列号
  • 在接收器中检查序列号是最后看到的数字+ 1如果没有抛出一个无序异常
  • 启用第二级重试(因此,如果它们出现故障,他们会在收到正确的消息后再次尝试)

这通常效果很好,但是如果某些事情发生故障太长时间,并且需要人工干预重新排序,有时候事情会变得有点不合适.

在您的方案中,可能有更好的方法.鉴于您只想在订单的修订中订购.我认为你可以用不需要有序交付的方式来构建它.

  • 将修订号添加到可以使用修订修改的所有字段
  • 如果消息中的修订号是> = db中的最后一个修订版,则仅更新该字段

这有很多好处.

  • 它不依赖于订单
  • 它通过仅要求接收器处理每个消息一次来减少负载
  • 如果单个消息出现问题,它可以通过不停止所有内容来处理错误.

但它有以下缺点:

  • 增加了db的复杂性
  • 它最终是一致的,如果你看一下db,它可能只包含一些用户所做的编辑.
  • 如果正确处理rev2错误和rev3,一些用户编辑将不会存在,但有些人会

  • 在您看来,NServiceBus为此方案提供框架级支持有多重要? (2认同)