Partilhar via


Ação de Exceção Bloqueada da Instância

A InstanceLockedExceptionAction propriedade do SqL Workflow Instance Store permite-lhe especificar a ação que o fornecedor de persistência do SQL deve tomar quando recebe um InstanceLockedException. O fornecedor de persistência recebe esta exceção quando tenta bloquear uma instância de serviço de fluxo de trabalho que está atualmente bloqueada por outro anfitrião de serviços. Os valores desta propriedade são NoRetry, BasicRetrye AggressiveRetry. O valor predefinido é NoRetry. A lista seguinte descreve as três opções:

  • NoRetry. O anfitrião de serviços não tenta bloquear a instância do serviço de fluxo de trabalho e passa para o InstanceLockedException autor da chamada. Se o fluxo de trabalho permanecer na memória durante um período superior a 60 segundos, utilize NoRetry como repetição. O valor predefinido é NoRetry.

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

  • AggressiveRetry. O anfitrião de serviços volta a tentar bloquear a instância do serviço de fluxo de trabalho com um intervalo exponencial de backoff entre tentativas de repetição e transmite a exceção ao autor da chamada no final da sequência. Se o fluxo de trabalho permanecer na memória durante muito pouco tempo (menos de 5 segundos) ou um farm Web for grande e a probabilidade de outra mensagem ser entregue ao mesmo anfitrião não for muito elevada, utilize AggressiveRetry para obter a melhor latência.

A funcionalidade Ação de Exceção Bloqueada da Instância suporta os seguintes cenários. Em todos os cenários, se a propriedade instanceLockedExceptionAction do SqlWorkflowInstanceStore estiver definida como BasicRetry ou AggressiveRetry, o anfitrião tenta de forma transparente adquirir o bloqueio em instâncias periodicamente.

  1. Ativar o encerramento gracioso e a reciclagem sobreposta de domínios de aplicações. Suponha que um AppDomain com um anfitrião de serviço a executar instâncias de serviço de fluxo de trabalho está a ser reciclado e é criado um novo AppDomain para processar novos pedidos em paralelo enquanto o AppDomain antigo é derrubado corretamente. O encerramento aguarda até que as instâncias do serviço de fluxo de trabalho estejam inativas e, em seguida, persiste e descarrega as instâncias. Todas as tentativas dos anfitriões no novo AppDomain para bloquear uma instância causarão um InstanceLockedException.

  2. Dimensionar horizontalmente fluxos de trabalho duráveis num farm homogéneo de servidores. Suponha que um nó de um farm de servidores no qual uma instância de fluxo de trabalho está a executar falhas e o anfitrião do fluxo de trabalho não consegue remover bloqueios na instância em que está em execução. Quando um anfitrião de serviços em execução noutro nó do farm recebe uma mensagem para essa instância de fluxo de trabalho, tenta adquirir bloqueios nestas instâncias, receberá o InstanceLockedException. Os bloqueios expirarão após algum tempo porque o anfitrião que era suposto renovar o bloqueio já não existe.

    Dimensionar horizontalmente fluxos de trabalho duráveis num farm homogéneo de servidores. Suponha que pretende dimensionar horizontalmente um fluxo de trabalho durável com vários anfitriões atrás de um NLB (rede Balanceador de Carga), o anfitrião de fluxo de trabalho em execução num nó do farm carrega uma instância de fluxo de trabalho e está a processar uma mensagem e a mensagem seguinte para a instância é encaminhada para o anfitrião que está em execução noutro nó porque o NLB não tem algoritmo de encaminhamento para entregar mensagens ao anfitrião que já está a executar a instância. Ao receber a mensagem, o segundo anfitrião tenta carregar a instância do fluxo de trabalho e recebe o InstanceLockedException porque o primeiro anfitrião tem um bloqueio na instância. O primeiro anfitrião desbloqueia a instância quando terminar de processar a primeira mensagem e o segundo anfitrião adquire o bloqueio quando tentar novamente da próxima vez, carrega a instância e processa a segunda mensagem.