Поделиться через


Действие в случае исключения «Экземпляр заблокирован»

Данный раздел относится к версии Windows Workflow Foundation 4.

Свойство Действие при возникновении исключения заблокированного экземпляра хранилища экземпляров рабочего процесса SQL позволяет указать, какое действие должен выполнить поставщик сохраняемости SQL при получении исключения InstanceLockedException. Поставщик сохраняемости получает это исключение, когда пытается заблокировать экземпляр службы рабочего процесса, который в настоящий момент заблокирован другим узлом службы. Допустимыми значениями для этого свойства являются Не повторять попытку, Обычное повторение и Агрессивное повторение. Значение по умолчанию — «Не повторять попытку». В следующем списке приводится описание этих трех параметров.

  • Не повторять попытку (значение по умолчанию). Поставщик сохраняемости не будет повторять попытку заблокировать экземпляр и передаст исключение InstanceLockedException вызывающему объекту.

  • Простой повтор. Поставщик сохраняемости снова попытается заблокировать экземпляр, используя линейный интервал попыток, и либо успешно заблокирует экземпляр, либо передаст исключение InstanceLockedException вызывающему объекту в конце последовательности.

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

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

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

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

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