Использование NHibernate для обновления таблицы состояния во время длительного процесса
Я унаследовал проект, который реализует несколько длительных процессов. Каждый из этих процессов обновляет таблицу состояния, которая затем отображается в пользовательском интерфейсе с помощью опроса ajax. Эти процессы выполняются в фоновом приложении, которое использует Rhino Service Bus (с MSMQ), и этот процесс запускается отправкой сообщения "выполнить длинный процесс".
Сам процесс выполняет все виды обработки данных, проверки, обновления, вставки, удаления и т. Д. В многочисленных таблицах.
Похоже, что он действительно злоупотребляет сеансом NHibernate с несколькими сеансами и вложенными TransactionScopes повсеместно.
Мой вопрос к специалистам NHibernate / RSB: как бы вы обновили таблицу состояний во время выполнения длительного процесса?
Я думал о:
- отправка "сообщения об обновлении состояния" во время выполнения процесса (потребуется решить проблемы управления сессиями NHibernate / RSB).
- использование саги с сохранением базы данных и запросом функций ajax вместо таблицы состояния
1 ответ
Проблема с обновлениями состояния в процессе RSB заключается в том, что обычно обработка сообщений происходит внутри самой области транзакции. Это означает, что любые изменения в базе данных или отправленных вами сообщениях (как правило) будут видны другим приложениям только после совершения транзакции (что происходит после завершения обработки сообщения).
Я обычно использую 3 подхода:
- обернуть обновления в TransactionScope, который подавляет внешнюю транзакцию (я подозреваю, что это то, что происходит в данный момент)
- разбить процесс на более мелкие сообщения (это может снизить конкуренцию в базе данных, но за счет увеличения количества сообщений)
- извещать внешних клиентов посредством какого-либо другого процесса (например, иметь какой-либо сервис удаленного взаимодействия / WCF / rest, который могут запрашивать другие процессы, или отправлять уведомления через какой-то процесс, неосведомленный о транзакции)