Compartilhar via


Ação de exceção bloqueada por instância

A InstanceLockedExceptionAction propriedade do Repositório de Instâncias de Fluxo de Trabalho do SQL permite especificar qual ação o provedor de persistência do SQL deve tomar quando recebe um InstanceLockedException. O provedor de persistência recebe essa exceção quando tenta bloquear uma instância de serviço de fluxo de trabalho que está bloqueada atualmente por outro host de serviço. Os valores dessa propriedade são NoRetry, BasicRetrye AggressiveRetry. O valor padrão é NoRetry. A lista a seguir descreve as três opções:

  • NoRetry. O host de serviço não tenta bloquear a instância do serviço de fluxo de trabalho e passa o InstanceLockedException chamador para ele. Se o fluxo de trabalho permanecer na memória por um período superior a 60 segundos, use NoRetry como repetição. O valor padrão é NoRetry.

  • BasicRetry. O host de serviço é reattempts para bloquear a instância do serviço de fluxo de trabalho com um intervalo linear entre tentativas de repetição e passa o InstanceLockedException chamador no final da sequência. Se o fluxo de trabalho permanecer na memória aproximadamente entre 5 e 60 segundos e as mensagens chegarem em lotes em que é mais provável que as mensagens enviadas para a mesma instância no mesmo host processem todas as mensagens antes de descarregar o fluxo de trabalho, use BasicRetry para obter a melhor latência sem desperdiçar recursos.

  • AggressiveRetry. O host de serviço é reattempts para bloquear a instância do serviço de fluxo de trabalho com um intervalo de retirada exponencial entre tentativas de repetição e passa a exceção para o chamador no final da sequência. Se o fluxo de trabalho permanecer na memória por muito pouco tempo (menos de 5 segundos) ou um farm da Web for grande e a chance de outra mensagem ser entregue ao mesmo host não for muito alta, use AggressiveRetry para obter a melhor latência.

O recurso Ação de Exceção Bloqueada por Instância dá suporte aos seguintes cenários. Em todos os cenários, se a propriedade instanceLockedExceptionAction do SqlWorkflowInstanceStore estiver definida BasicRetry como ou AggressiveRetry, o host tentará adquirir o bloqueio de forma transparente em instâncias periodicamente.

  1. Habilitando o desligamento normal e a reciclagem sobreposta de domínios de aplicativo. Suponha que um AppDomain com um host de serviço executando instâncias de serviço de fluxo de trabalho esteja sendo reciclado e um novo AppDomain seja criado para lidar com novas solicitações em paralelo enquanto o AppDomain antigo é derrubado normalmente. O desligamento aguarda até que as instâncias de serviço de fluxo de trabalho estejam ociosas e, em seguida, persista e descarrega as instâncias. Qualquer tentativa de hosts no novo AppDomain de bloquear uma instância causará um InstanceLockedException.

  2. Dimensionamento horizontal de fluxos de trabalho duráveis em um farm homogêneo de servidores. Suponha que um nó de um farm de servidores no qual uma instância de fluxo de trabalho esteja executando falhas e o host de fluxo de trabalho não possa remover bloqueios na instância em que está em execução. Quando um host de serviço em execução em outro nó do farm recebe uma mensagem para essa instância de fluxo de trabalho, ele tenta adquirir bloqueios nessas instâncias.InstanceLockedException Os bloqueios expirarão após algum tempo porque o host que deveria renovar o bloqueio não existe mais.

    Dimensionamento horizontal de fluxos de trabalho duráveis em um farm homogêneo de servidores. Suponha que você queira dimensionar horizontalmente um fluxo de trabalho durável usando vários hosts por trás de um NLB (Balanceador de Carga de Rede), o host de fluxo de trabalho em execução em um nó do farm carrega uma instância de fluxo de trabalho e está processando uma mensagem e a próxima mensagem para a instância é roteada para o host que está em execução em outro nó porque o NLB não tem algoritmo de roteamento para entregar mensagens ao host que já está executando a instância. Ao receber a mensagem, o segundo host tenta carregar a instância de fluxo de trabalho e recebe o InstanceLockedException porque o primeiro host tem um bloqueio na instância. O primeiro host desbloqueia a instância quando ela é concluída com o processamento da primeira mensagem e o segundo host adquire o bloqueio quando tenta novamente na próxima vez, carrega a instância e processa a segunda mensagem.