gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:03:46 24 4
gpt4 key购买 nike

设想:

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

一些审计数据需要按特定顺序进行,但有些可以在初始消息之后的任何时间接收,例如在此过程中将多次发送的状态更新。

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

public class MyServer : IConfigureThisEndpoint, AsA_Server, ISpecifyMessageHandlerOrdering
{
public void SpecifyOrder(Order order)
{
order.Specify(First<PrimaryCommand>.Then<SecondaryCommand>());
}
}

因为不知道消息的显式顺序,所以一条消息 InitialAuditMessage 是初始消息,并且继承自 PrimaryCommand。

其他允许在后期接收的消息继承自 SecondaryCommand。
public class StartAuditMessage : PrimaryCommand
public class UpdateAudit1Message : SecondaryCommand
public class UpdateAudit2Message : SecondaryCommand
public class ProcessUpdateMessage : SecondaryCommand

这适用于控制从同一线程发送的消息的处理顺序。

但是,如果消息是从单独的线程或进程发送的,这会发生故障,这是有道理的,因为没有任何东西可以将消息链接为相关。

我如何链接消息,比如通过某种 ID,以便在从单独的线程发送时不会乱序处理它们?这是 Sagas 的用例吗?

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

最佳答案

每当您需要有序处理时,您都无法避免这样的结论:在处理的某个时刻,您需要将所有内容限制为单个线程。单线程保证事物处理的顺序。

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

关于NServiceBus - 当 Bus.Send() 发生在不同的线程/进程上时,如何控制消息处理程序的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8804412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com