Compartilhar via


Ação bloqueado de exceção de instância

A propriedade de InstanceLockedExceptionAction de instância Store de fluxo de trabalho do SQL permite que você especifique que ação o provedor de persistência do SQL deve tomar quando ele recebe InstanceLockedException. O provedor de persistência recebe esta exceção quando tentar bloquear uma instância do serviço de fluxo de trabalho que está atualmente bloqueada por outro host serviço. Os valores para essa propriedade é NoRetry, BasicRetry, e 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 de serviço do fluxo de trabalho e passa o InstanceLockedException ao chamador. Se o fluxo de trabalho ficar na memória por um período superior a 60 segundos, use NoRetry como uma nova tentativa. O valor padrão é NoRetry.

  • BasicRetry. Os reattempts de host serviço para bloquear a instância do serviço de fluxo de trabalho com um intervalo linear entre a nova tentativa tentam e passam InstanceLockedException para o chamador no final da sequência. Se você fluxo de trabalho permanece na memória aproximadamente entre 5-60 segundos, e mensagens chegue em lotes onde é mais provável para as mensagens que estão sendo enviadas para a mesma instância no mesmo host para processar as mensagens antes de descarregar o fluxo de trabalho, use BasicRetry para obter melhor latência sem desperdiçar recursos.

  • AggressiveRetry. Os reattempts de host serviço para bloquear a instância do serviço de fluxo de trabalho com um intervalo exponencialmente de backoff entre a nova tentativa tentam, e passe a exceção para o chamador no final da sequência. Se seu fluxo de trabalho permanece na memória por muito um tempo abreviado (menos de 5 segundos), ou uma Web farm é grande e a possibilidade de outra mensagem que está sendo entregada ao mesmo host não é muito alta, usa AggressiveRetry para obter melhor latência.

O recurso protegido instância de ação de exceção oferece suporte aos seguintes cenários. Em todos os cenários, se a propriedade de instanceLockedExceptionAction de SqlWorkflowInstanceStore é definida como BasicRetry ou a AggressiveRetry, o host tentar de novo transparente para adquirir periodicamente o bloqueio em instâncias.

  1. Ativando o desligamento elegante e reciclagem sobrepostos domínios de aplicativo. Suponha que AppDomain com instâncias em execução de um serviço de fluxo de trabalho de host serviço está sendo reciclado e novo AppDomain é colocado até as novas solicitações de forma paralelamente quando AppDomain antigo é normalmente derrubado. O desligamento espera até que as instâncias de serviço de fluxo de trabalho são ociosos, e então descarrega e persistir as instâncias. Todas as tentativas por hosts em novo AppDomain de bloquear uma instância causarão InstanceLockedException.

  2. Horizontalmente dimensionamento fluxos de trabalho duráveis através de um farm de servidores homogêneo. Suponha que um nó de um farm de servidores em que uma instância de fluxo de trabalho está executando falhas e o host de fluxo de trabalho não pode remover os bloqueios na instância que está executando. Quando uma execução do host serviço em outro nó de farm recebe uma mensagem para essa instância do fluxo de trabalho, tentar adquirir bloqueios nessas instâncias que receberá InstanceLockedException. Os bloqueios expirarão após algum tempo porque o host que foi suponha renovar o bloqueio ainda não existir.

    Horizontalmente dimensionamento fluxos de trabalho duráveis através de um farm de servidores homogêneo. Suponha que você deseja redimensionar horizontalmente um fluxo de trabalho durável usando vários hosts atrás de um NLB (equilibrador de carga de rede), a execução do host de fluxo de trabalho em um nó carrega de farm uma instância de fluxo de trabalho e está processando uma mensagem, e a mensagem seguinte à instância é roteada para o host que está executando em outro nó porque o NLB não tem o algoritmo de roteamento para enviar mensagens ao host que já está executando a instância. Em cima de receber a mensagem, a segunda tentativas de host de carregar a instância de fluxo de trabalho e recebem InstanceLockedException porque o primeiro host tem um bloqueio na instância. O primeiro host desbloqueia a instância quando estiver concluído processamento com a primeira mensagem e o segundo host adquire o bloqueio quando tentar novamente a próxima vez, carregar a instância, e processa a segunda mensagem.