2014-08-29 3 views
0

Я очень новичок в 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());

Может кто-нибудь мне точку в правильном направлении, чтобы, если я делаю это правильно - это ожидаемая медленная (иш) производительность.Благодарю.

ответ

1

У нас есть аналогичный процесс, и проблема в том, что вся эта работа завершена в той же транзакции, что и вы обнаружили. Вы захотите создать другую конечную точку для обработки ваших дочерних сообщений.

Я бы рекомендовал настроить дистрибьютора в NSB и предоставить Дистрибьютору всю детскую обработку для работников. Поэтому вы можете масштабировать обработку дочерних сообщений по мере необходимости.

+0

Спасибо за информацию - я рассмотрю использование Дистрибьютора –