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

时间:2013-09-06 23:53:34

标签: .net msmq nservicebus esb servicebus

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

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

下面列出了我的一些想法 -

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

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

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

    非常感谢一些指导。

    感谢。

1 个答案:

答案 0 :(得分:8)

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

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

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

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

  • 将修订号添加到您可以使用修订
  • 修改的所有字段
  • 仅在消息中的修订号为> = db
  • 中的最后一个修订版时才更新该字段

这有很多好处。

  • 它不依赖于订单
  • 通过仅要求接收方处理每条消息一次
  • 来减少负载
  • 如果单个消息出现问题,它就会因为没有停止所有内容而很好地处理错误。

但它有以下缺点:

  • 增加了db
  • 的复杂性
  • 它最终是一致的,如果你查看数据库,它可能只包含一些用户所做的编辑。
  • 如果正确处理rev2错误和rev3,某些用户编辑将不会出现,但有些会