NServiceBus-当消息生成许多子消息时出错

本文关键字:消息 许多 出错 NServiceBus- | 更新日期: 2023-09-27 18:19:55

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

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

这在我们的生产环境中似乎适用于少于1000个子订单,但一旦我们达到1000个子订单以上,我们经常会看到父消息没有被处理,因此子消息也没有被创建。

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

我发现,如果我在EndpointConfig中设置DoNotWrapHandlersExecutionInATransactionScope,那么我不会得到异常,直到作为父消息出现超时。我可以通过增加事务超时来防止这种情况。

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

也许整个方法是错误的——我知道NserviceBus中存在Saga,但对它们一无所知——也许我所描述的过程应该使用Saga。。。

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

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

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

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

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

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

有人能为我指明正确的方向吗?我做得是否正确——这是预期的缓慢(ish)表现。谢谢

NServiceBus-当消息生成许多子消息时出错

我们有一个类似的过程,挑战在于所有这些工作都被封装在您发现的同一事务中。您将希望创建另一个端点来处理您的子消息。

我建议在NSB中配置分发服务器,并让分发服务器将所有子处理委派给工作者。因此,您可以根据需要扩展对子消息的处理。