Действие "Заблокированное исключение экземпляра"

Свойство InstanceLockedExceptionAction хранилища экземпляров рабочих процессов SQL позволяет указать, какое действие должен принимать поставщик сохраняемости SQL при получении InstanceLockedException. Поставщик сохраняемости получает это исключение при попытке заблокировать экземпляр службы рабочего процесса, который в настоящее время заблокирован другим узлом службы. Значения этого свойства: NoRetry, BasicRetryи AggressiveRetry. Значение по умолчанию — NoRetry. В следующем списке описаны три варианта:

  • NoRetry. Узел службы не пытается заблокировать экземпляр службы рабочего процесса и передает вызывающий InstanceLockedException объект. Если рабочий процесс остается в памяти в течение 60 секунд, используйте NoRetry его в качестве повтора. Значение по умолчанию — NoRetry.

  • BasicRetry. Узел службы повторно презрит блокировку экземпляра службы рабочего процесса с линейным интервалом между попытками повторных попыток и передает InstanceLockedException вызывающему объекту в конце последовательности. Если рабочий процесс остается в памяти примерно от 5 до 60 секунд, а сообщения приходят в пакеты, в которых, скорее всего, сообщения отправляются в один экземпляр на одном узле для обработки всех сообщений перед выгрузки рабочего процесса, используйте BasicRetry для достижения оптимальной задержки без использования ресурсов.

  • AggressiveRetry. Узел службы повторно презрит блокировку экземпляра службы рабочего процесса с экспоненциальным интервалом обратного выхода между попытками повторных попыток и передает исключение вызывающему объекту в конце последовательности. Если рабочий процесс остается в памяти в течение очень короткого времени (менее 5 секунд), или веб-ферма большая, и вероятность доставки другого сообщения на тот же узел не очень высока, используйте AggressiveRetry для достижения оптимальной задержки.

Функция действия "Заблокированное исключение экземпляра" поддерживает следующие сценарии. Во всех сценариях, если для свойства instanceLockedExceptionAction для SqlWorkflowInstanceStore задано BasicRetry значение или AggressiveRetryузел прозрачно повторяет получение блокировки экземпляров периодически.

  1. Включение корректного завершения работы и перекрытия повторной переработки доменов приложений. Предположим, что объект AppDomain с узлом службы, на котором выполняются экземпляры службы рабочих процессов, перезапускается, а новый домен приложения создается для параллельного обработки новых запросов, в то время как старый доменприложений будет удален корректно. Завершение работы ожидает простоя экземпляров службы рабочих процессов, а затем сохраняет и выгрузит экземпляры. Любые попытки узлов в новом домене приложений заблокировать экземпляр приведет к InstanceLockedExceptionвозникновению ошибки.

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

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