Сведения о вопросе

FELL

21:06, 1st October, 2020

Теги

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

Просмотров: 426   Ответов: 3

немного новичок в работе windows, так что идите легко :)

Я хочу создать среду хоста рабочего процесса, которая имеет высокую доступность-минимум 2 WF хостов времени выполнения на отдельном оборудовании, указывающих на одну и ту же базу данных Persistence или tracking SQL.

Я ищу шаблон, с помощью которого я могу асинхронно создавать новые экземпляры рабочего процесса на основе некоторого внешнего события (т. е. некоторая часть данных обновляется в DB другим приложением). Для каждого события мне нужно создать ровно один экземпляр рабочего процесса и не имеет значения, на каком хосте этот экземпляр создан. Существует также некоторая гибкость в отношении продолжительности времени между событием и фактическим созданием экземпляра рабочего процесса.

Одним из решений, которое я рассматриваю, является наличие интерфейса WCF на хостах WF и размещение их за каким-то балансировщиком нагрузки. Это было бы тогда до любой части системы, которая запускает "event", чтобы сделать вызов WCF.

Я не очень доволен этим, потому что если хосты both\all WF не работают или иным образом недоступны, событие может быть "lost". Кроме того, я не смогу управлять нагрузкой так, как мне бы хотелось. Я представляю себе ситуацию, когда за небольшой промежуток времени может произойти много событий, но совершенно допустимо обрабатывать эти события некоторое время спустя.

Поэтому я считаю, что мне нужно каким-то образом сохранить события и отделить создание событий от обработки событий.

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

Будет ли полезен NServiceBus и прочный обмен сообщениями здесь?

Любые идеи будут высоко оценены.

Дополнение

База данных будет кластеризована с общим хранилищем оптоволоконных каналов. Сеть также будет избыточной. Для того, чтобы экземпляры среды выполнения WF имели отказоустойчивость, они должны указывать на общую службу персистентности, которая в данном случае является серверной частью SQL. Это высокая доступность, а не полная доступность :)

MSDN статья о надежности и высокой доступности WF

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



  Сведения об ответе

FAriza

02:32, 10th August, 2020

Если вы используете службу WCF с netMsmqBinding, вы можете получать сообщения в очереди без необходимости опроса. Сообщения будут ждать, если нет службы, работающей, чтобы забрать их. Вы хотели бы убедиться, что используете кластерную очередь для надежности в случае, если основная машина очереди выходит из строя.

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


  Сведения об ответе

davran

06:29, 29th August, 2020

Я бы пошел с таблицей событий MSMQ/. Опрос только грязный, если вы делаете это неправильно.

Одна вещь, которую нужно иметь в виду: вы говорите, что хотите несколько серверов WF для высокой доступности, но оба они используют один и тот же сервер SQL ? Высокая доступность работает только в том случае, если вы удаляете все отдельные точки сбоя, а не только некоторые из них.


  Сведения об ответе

$DOLLAR

02:14, 23rd August, 2020

Вот как я ее решил.

Я использую NServiceBus и с каждым хостом среды выполнения WF, указывающим на тот же messagebus (используя MSMQ в качестве транспорта). NServiceBus поддерживает транзакционное считывание с шины сообщений и откат. Если сообщение снято с шины, но процесс завершается до того, как сообщение будет полностью обработано, оно остается в очереди, и другой хост среды выполнения заберет его.

Чтобы узлы среды выполнения WF работали на отдельных машинах, messagebus\queue должен находиться на сервере Windows 2008 (MSMQ 4.0) или более поздней версии, так как более ранние версии MSMQ не поддерживают удаленное чтение транзакций. Примечание также, чтобы выполнить удаленное транзакционное чтение, машине, выполняющей чтение, также потребуется установить MSMQ 4.0 (т. е. Windows Server 2008)


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться