【发布时间】: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