Лучшие практики для написания длительных пользовательских действий для WF 3.0 / 3.5 - PullRequest
0 голосов
/ 18 февраля 2009

Рекомендации по написанию долгосрочных пользовательских действий для Workflow Foundation (3.0 / 3.5) предлагают что для действия не рекомендуется выполнять длительную задачу полностью в рамках метода Execute действия. Один поток, выделенный для рабочего процесса, будет заблокирован, что препятствует обработке других запланированных запросов для рабочего процесса.

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

Так что мой вопрос в том, что именно количественно определяет задачу как долго выполняемую? Это вопрос времени обработки? Когда следует создавать очередь, а когда достаточно использовать локальный сервис?

Спасибо за любые разъяснения.

1 Ответ

1 голос
/ 18 февраля 2009

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

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

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

EDIT

Эта 2-минутная вещь исходит от RFC 793, которая требует, чтобы ни один сеанс TCP не оставался бездействующим более 2 минут. Я подумал, что если моя система взаимодействует с вашей системой, и для ее завершения требуется более 2 минут, им не следует ждать завершения друг друга.

...