【问题标题】:NServiceBus - getting error when message spawns many child messagesNServiceBus - 当消息产生许多子消息时出现错误
【发布时间】:2014-08-29 13:05:20
【问题描述】:

我是 NserviceBus 的新手,我有一个 NServiceBus 应用程序,它使用一个命令处理一条消息,该命令创建多个包含不同命令的子消息。

例如,我将消息 BulkOrder01 放在由我的 BulkOrder 消息处理程序拾取的队列中。我的 BulkOrder01 的有效负载包含一个批量订单 ID,在数据库中查找该 ID 时会返回 4000 个订单。对于这些子订单中的每一个,我都会向队列发送一条订单消息。

对于少于 1000 个子订单的生产环境,这似乎可以正常工作,但是一旦超过 1000 个,我们经常会看到父消息没有被处理,因此子消息没有被创建。

在本地运行它时,我发现它会向队列发送一两条子消息,但随后会出现 NServiceBus.Unicast.Queing 异常。 FailedToSendMessgeException '无法将消息发送到地址:Namespace.OrderService@MyComputername' 内部异常是 'System.Messaging.MessageQueueException 无法登记事务'

我发现,如果我在 EndpointConfig 中设置 DoNotWrapHandlersExecutionInATransactionScope,那么直到 出现 父消息超时之前我不会收到异常。我可以通过增加事务超时来防止。

但是设置DoNotWrapHandlersExecutionInATransactionScope 让我感到紧张,我似乎找不到太多关于它实际作用的信息。显然它不会将处理程序的执行包装在事务范围内,但从我执行的测试来看,它似乎仍然具有事务性,因此如果父消息失败,则不会发送任何子消息。我记得读过有多层事务范围 - 那么这只是删除其中一个层吗?

也许这整个方法是错误的 - 我知道 NserviceBus 中存在 Sagas,但对它们一无所知,也许我描述的过程应该使用 Saga 来完成......

谷歌搜索异常表明这是一个超时问题,但是我发现仅增加它自己的超时只会将异常延迟超时量。只有当我有DoNotWrapHandlersExecutionInATransactionScopeset 时,它才能在本地工作。在生产中,它似乎更可靠地工作,并且只会在大量子消息上失败。

此外,创建的子消息似乎需要相当长的时间才能添加到队列中,大约需要 50 毫秒,当扩展到 4000 条消息时,总共需要 3.3 分钟。将一条小消息放入队列似乎需要很长时间,可能配置不正确?

我在运行 NServiceBus 4.3.0.0 的 C# 4.5 环境中使用实体框架访问数据库并使用 Unity 进行依赖注入

我正在使用IBus.SendLocal 发送消息,我正在配置超时和设置如下:

NServiceBus.Configure.Transactions.Advanced(x => x.DefaultTimeout(new TimeSpan(0, 5, 0)));

NServiceBus.Configure.Transactions.Advanced(x => x.DoNotWrapHandlersExecutionInATransactionScope());

谁能指出我是否正确执行此操作的正确方向 - 是预期的缓慢(ish)性能。谢谢。

【问题讨论】:

    标签: c# nservicebus


    【解决方案1】:

    我们有一个类似的流程,挑战在于所有这些工作都包含在您发现的同一事务中。您将需要创建另一个端点来处理您的子消息。

    我建议在 NSB 中配置 Distributor,并让 Distributor 将所有子进程委托给 worker。因此,您可以根据需要扩展子消息的处理。

    【讨论】:

    • 感谢您的信息 - 我会看看使用分销商
    猜你喜欢
    • 2011-02-27
    • 2021-06-17
    • 1970-01-01
    • 2020-10-16
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多