Как улучшить производительность моей NServiceBus Saga под нагрузкой

У меня есть очень простая Saga, созданная с помощью NSB7 с использованием SQL Transport и сохраняемости NHibernate.

Saga прослушивает очередь и для каждого полученного сообщения проходит через 4 обработчика. Они вызываются в последовательном порядке, при этом 2 обработчика выполняются параллельно, а последний обработчик запускается только после завершения работы обоих параллельных обработчиков. Последний обработчик записывает запись в БД

Скажем, для одного сообщения каждый обработчик занимает 1 секунду. При получении нового сообщения, запускающего сагу, ожидаемый результат - через 3-4 секунды запись записывается в БД.

Если очередь резервируется, скажем, с 1000 сообщений, после того, как они снова начнут обрабатываться, пройдет почти 2000 секунд, прежде чем в последнем обработчике будет создана новая запись. По сути, вместо ожидаемого 4-секундного времени обработки для каждого сообщения они эффективно группируются в начальных обработчиках до тех пор, пока очередь не опустеет, а затем делает это снова для следующего обработчика и так далее.

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

Спасибо Уилл


person Spencer Rock    schedule 07.03.2020    source источник
comment
Взгляните на ServicePulse Monitoring и попытайтесь найти причину задержки. Возможно, вы обнаружите, что у вас много повторных попыток из-за исключений параллелизма? Если это так, вы можете пересмотреть свой дизайн.   -  person Sean Farmar    schedule 08.03.2020
comment
Да, проверил ServcePulse, который не показывает повторных попыток, только подтверждает, что все 1000 сообщений завершают первый обработчик, прежде чем перейти ко второму обработчику.   -  person Spencer Rock    schedule 08.03.2020
comment
Возможно, лучше всего открыть обращение в службу поддержки [email protected], particular.net/support.   -  person Sean Farmar    schedule 08.03.2020


Ответы (1)


Существует документация по проблемам параллелизма саги: https://docs.particular.net/nservicebus/sagas/concurrency#high-load-scenarios

Я все еще не полностью понимаю проблему, хотя. Каждое сообщение, которое создает экземпляр саги, должно создавать запись в базе данных после обработки сообщения. Не после 1000 сообщений. Как еще NServiceBus собирается гарантировать согласованность?

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

person Dennis van der Stelt    schedule 09.03.2020