NServiceBus-在不同线程/进程上发生Bus.Send()时,如何控制消息处理程序顺序?

NServiceBus-在不同线程/进程上发生Bus.Send()时,如何控制消息处理程序顺序?,nservicebus,Nservicebus,情景: 我有一个通过NServiceBus发送审核消息的场景。处理程序在预先存在的数据库表上插入并更新一行,我们没有权限更改该行。我们需要控制消息的处理顺序,以便审计数据反映正确的系统状态。无序处理的消息可能会导致审核数据反映不正确的状态 有些审核数据是按特定顺序发送的,但有些可以在初始消息之后的任何时间接收,例如在该过程中发送多次的状态更新 在我的测试项目中,我一直在使用服务器(特别是ISpecifyMessageHandlerOrdering功能)进行测试,其端点配置如下: public c

情景:

我有一个通过NServiceBus发送审核消息的场景。处理程序在预先存在的数据库表上插入并更新一行,我们没有权限更改该行。我们需要控制消息的处理顺序,以便审计数据反映正确的系统状态。无序处理的消息可能会导致审核数据反映不正确的状态

有些审核数据是按特定顺序发送的,但有些可以在初始消息之后的任何时间接收,例如在该过程中发送多次的状态更新

在我的测试项目中,我一直在使用服务器(特别是ISpecifyMessageHandlerOrdering功能)进行测试,其端点配置如下:

public class MyServer : IConfigureThisEndpoint, AsA_Server, ISpecifyMessageHandlerOrdering
    {
          public void SpecifyOrder(Order order)
          {
               order.Specify(First<PrimaryCommand>.Then<SecondaryCommand>());
          }
    }
这可以控制从同一线程发送的消息的处理顺序

但是,如果消息是从单独的线程或进程发送的,则会出现这种情况,这是有意义的,因为没有任何东西可以链接相关的消息

我如何链接消息,比如说通过某种ID,这样当从不同的线程发送消息时,它们不会被无序处理?这是传奇的一个用例吗


另外,关于状态更新消息,我如何确保按照发送顺序处理相同类型的消息?

每当您需要进行有序处理时,您都会得出这样的结论:在处理过程中的某个时刻,您需要将所有内容限制在单个线程内。单线程保证了事物处理的顺序


在某些情况下,您可以通过使用相关标识符拆分处理,将单个线程“扩展”为多个线程。关联ID允许您定义必须在其中维护顺序的消息的逻辑分组。这使您可以让每个并发线程执行更高效的有序处理。

审核行上是否有某种日期戳?您应该能够根据该戳记选择和排序行。不幸的是,我们没有权限更改此表。我认为单线程并不能保持顺序。想象一下这样一个场景:消息失败,最终进入错误队列,返回原始队列重试如果您正在对消息进行重新排序(),您将通过阻止已排序的批处理来处理失败,直到成功处理所有消息,从而维持顺序。我的观点是,任何订单交付都绝对需要一个线程来维护订单。看起来这个答案总结了这一点。正在设计另一种处理方法!
public class StartAuditMessage : PrimaryCommand
public class UpdateAudit1Message : SecondaryCommand
public class UpdateAudit2Message : SecondaryCommand
public class ProcessUpdateMessage : SecondaryCommand