NServicebus - потоковая обработка в нескольких конечных точках

У меня есть две конечные точки.

Конечная точка 1:

  • HandlerForMessage X
  • HandlerForMessage Y
  • HandlerForMessage Z

Конечная точка сети: - В настоящее время нет обработчиков, просто отправляются команды на шину.

Происходит следующее:

  1. Интернет -> Отправить(..);
  2. Конечная точка 1: получение сообщения X
  3. Конечная точка 1: обрабатывать MessageX и в обработчике Bus.Send() и Bus.Send()
  4. Конечная точка 1: получить сообщение Y, обработать его (это занимает 20 секунд)
  5. Конечная точка 1: 20 секунд спустя, после обработки MessageY, получите MessageZ и обработайте его.

Начиная с MessageY, MessageZ имеют разные обработчики, не может ли это быть сделано одновременно?

Создание другой конечной точки или перемещение ее в другую конечную точку не вариант. Я просто хочу, чтобы он был многопоточным, когда речь идет о различных типах сообщений (и обработчиков). Я не понимаю, почему это не поведение по умолчанию.

Как настроить nservicebus для одновременной обработки нескольких сообщений от другого типа (с другим обработчиком)?

NServiceBus 4.6.5 (или если мне нужно обновить до 5, хорошо, я не против. Просто хочу иметь многопоточность). Транспорт: SqlServer и для другого проекта Windows Azure Service Bus

2 ответа

Решение

Если это не изменилось, так как я начал использовать NServiceBus, "unlicenced" Версия запускает только 1 рабочий поток, поэтому обрабатывает только 1 сообщение за раз.

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

<MsmqTransportConfig MaxRetries="0" NumberOfWorkerThreads="1" />

В NServiceBus v4 вам необходимо настроить MaximumConcurrencyLevel значение на TransportConfig:

<TransportConfig MaximumConcurrencyLevel="5" 
                 MaxRetries="2" 
                 MaximumMessageThroughputPerSecond="0"/>

см. Обработка ошибок и регулирование

Если я правильно понимаю ваш сценарий, это одна транзакция / единица работы...

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

Если вы не хотите запускать несколько конечных точек, взгляните на эту проблему, описывающую запуск нескольких конечных точек в одном процессе: https://github.com/Particular/NServiceBus/issues/1357

Это помогает?

Другие вопросы по тегам