Я очень новичок в NserviceBus, и у меня есть приложение NServiceBus, которое обрабатывает сообщение с помощью команды, которая создает несколько дочерних сообщений, содержащих другую команду.NServiceBus - получение ошибки, когда сообщение порождает множество дочерних сообщений
Например, я поставил сообщение BulkOrder01 в очереди, которое получает мой обработчик сообщений BulkOrder. Полезная нагрузка моего BulkOrder01 координирует идентификатор массового заказа, который при поиске в базе данных возвращает 4000 заказов. Для каждого из этих дочерних заказов я отправляю сообщение «Заказ» в очередь.
Это нормально работает в нашей производственной среде для менее 1000 дочерних заказов, но как только мы получаем более 1000, мы часто видим, что родительское сообщение не обрабатывается, и поэтому дочерние сообщения не создаются.
При запуске локально я обнаружил, что он отправит одно или два дочерних сообщения в очередь, но затем будет исключение с помощью NServiceBus.Unicast.Queing. FailedToSendMessgeException
«Не удалось отправить сообщение по адресу: [email protected]» и внутреннее исключение «System.Messaging.MessageQueueException Не удается завербовать сделку»
Я обнаружил, что, если я изложу DoNotWrapHandlersExecutionInATransactionScope
в EndpointConfig то я не получаю исключения до тех пор, пока не появится. Который я могу предотвратить, увеличив тайм-аут транзакции.
Однако установка DoNotWrapHandlersExecutionInATransactionScope
заставляет меня нервничать, я не могу найти много информации о том, что это на самом деле делает. Очевидно, что не завершает обработку обработчиков в области транзакций, но из теста, который я выполнил, по-прежнему кажется, что он ведет себя транзактивно, поэтому если родительское сообщение выходит из строя, ни одно из дочерних сообщений не отправляется. Я помню, что читал, что существует несколько уровней транзакции - так ли это просто удалить один из этих слоев?
Может быть, весь этот подход неправильный способ идти об этом - я знаю о существовании сагах внутри NserviceBus, но ничего на самом деле о них, может быть, процесс я описал должно быть сделано с помощью Saga ...
Исправлена ошибка, связанная с исключением из-за того, что это проблема с тайм-аутом, однако я обнаружил, что только увеличение тайм-аута на его основе просто задерживает исключение по сумме тайм-аута. Он работает только локально, когда у меня установлен DoNotWrapHandlersExecutionInATransactionScope
. В rpoduction он работает более надежно и только терпит неудачу при больших объемах детских сообщений.
Также создаются дочерние сообщения, которые, как представляется, занимают довольно много времени, чтобы добавить их в очередь, около 50 миллисекунд, которые при масштабировании до 4000 сообщений составляют в общей сложности 3,3 минуты. Кажется, что долгое время помещать небольшое сообщение в очередь, может быть, что-то не настроено правильно?
Я использую Entity Framework для доступа к базе данных и единства для внедрения зависимостей в среде C# 4.5 работает NServiceBus 4.3.0.0
Я использую IBus.SendLocal
для отправки сообщений, и я настройка тайм-аут и настройки следующим образом:
NServiceBus.Configure.Transactions.Advanced(x => x.DefaultTimeout(new TimeSpan(0, 5, 0)));
NServiceBus.Configure.Transactions.Advanced(x => x.DoNotWrapHandlersExecutionInATransactionScope());
Может кто-нибудь мне точку в правильном направлении, чтобы, если я делаю это правильно - это ожидаемая медленная (иш) производительность.Благодарю.
Спасибо за информацию - я рассмотрю использование Дистрибьютора –