Partilhar via


Práticas recomendadas de persistência

Este documento aborda as práticas recomendadas para design e configuração de fluxo de trabalho relacionados à persistência do fluxo de trabalho.

Desenho e Implementação de Fluxos de Trabalho Duráveis

Em geral, os fluxos de trabalho executam o trabalho em períodos curtos que são intercalados com momentos durante os quais o fluxo de trabalho está ocioso porque está aguardando um evento. Este evento pode ser coisas como uma mensagem ou um temporizador expirando. Para poder descarregar a instância do fluxo de trabalho quando ela ficar ociosa, o host de serviço deve manter a instância do fluxo de trabalho. Isso só é possível se a instância do fluxo de trabalho não estiver em uma zona sem persistência (por exemplo, aguardando a conclusão de uma transação ou aguardando um retorno de chamada assíncrono). Para permitir que uma instância de fluxo de trabalho ociosa seja descarregada, o autor do fluxo de trabalho deve usar escopos de transação e atividades assíncronas apenas para ações de curta duração. Em particular, o autor deve manter as atividades de atraso dentro dessas zonas de não persistência o mais curto possível.

Um fluxo de trabalho só pode ser persistido se todos os tipos de dados usados pelo fluxo de trabalho forem serializáveis. Além disso, os tipos personalizados usados em fluxos de trabalho persistentes devem ser serializáveis com NetDataContractSerializer para serem persistidos pelo SqlWorkflowInstanceStore.

Uma instância de fluxo de trabalho não pode ser recuperada em caso de falha de um host ou computador se ela não tiver sido persistida. Em geral, recomendamos que você persista uma instância de fluxo de trabalho no início do ciclo de vida do fluxo de trabalho.

Se o fluxo de trabalho estiver ocupado por muito tempo, recomendamos que você persista a instância do fluxo de trabalho regularmente durante todo o período ocupado. Você pode fazer isso adicionando Persist atividades em toda a sequência de atividades que mantêm a instância do fluxo de trabalho ocupada. Dessa maneira, a reciclagem do domínio do aplicativo, falhas de host ou falhas de computador não fazem com que o sistema seja revertido para o início do período ocupado. Esteja ciente de que adicionar Persist atividades ao seu fluxo de trabalho pode levar a uma degradação do desempenho.

O Windows Server App Fabric simplifica muito a configuração e o uso da persistência. Para obter mais informações, consulte Persistência do Windows Server App Fabric

Configuração de parâmetros de escalabilidade

Os requisitos de escalabilidade e desempenho determinam as configurações dos seguintes parâmetros:

Esses parâmetros devem ser definidos da seguinte forma, de acordo com o cenário atual.

Cenário: um pequeno número de instâncias de fluxo de trabalho que exigem tempo de resposta ideal

Nesse cenário, todas as instâncias de fluxo de trabalho devem permanecer carregadas quando ficam ociosas. Defina TimeToUnload como um valor grande. O uso dessa configuração impede que uma instância de fluxo de trabalho se mova entre computadores. Use essa configuração somente se uma ou mais das seguintes opções forem verdadeiras:

  • Uma instância de fluxo de trabalho recebe uma única mensagem durante todo o seu tempo de vida.

  • Todas as instâncias de fluxo de trabalho são executadas em um único computador

  • Todas as mensagens recebidas por uma instância de fluxo de trabalho são recebidas pelo mesmo computador.

Use Persist atividades ou defina TimeToPersist como 0 para habilitar a recuperação da instância do fluxo de trabalho após falhas no host de serviço ou no computador.

Cenário: As instâncias de fluxo de trabalho estão ociosas por longos períodos de tempo

Nesse cenário, defina TimeToUnload como 0 para liberar recursos o mais rápido possível.

Cenário: instâncias de fluxo de trabalho recebem várias mensagens em um curto período de tempo

Nesse cenário, defina TimeToUnload como 60 segundos se essas mensagens forem recebidas pelo mesmo computador. Isso impede uma sequência rápida de descarregamento e carregamento de uma instância de fluxo de trabalho. Isso também não mantém a instância na memória por muito tempo.

Defina TimeToUnload como 0 e defina InstanceLockedExceptionAction como BasicRetry ou AggressiveRetry se essas mensagens puderem ser recebidas por computadores diferentes. Isso permite que a instância do fluxo de trabalho seja carregada por outro computador.

Cenário: O fluxo de trabalho usa atividades de atraso com durações curtas

Nesse cenário, o SqlWorkflowInstanceStore regularmente sonda o banco de dados de persistência para instâncias que devem ser carregadas devido a uma atividade expirada Delay . Se encontrar SqlWorkflowInstanceStore um temporizador que expirará no próximo intervalo de sondagem, o Repositório de Instâncias do Fluxo de Trabalho SQL encurtará o intervalo de sondagem. A próxima sondagem ocorrerá logo após o temporizador ter expirado. Dessa forma, o Repositório de Instâncias do Fluxo de Trabalho SQL alcança uma alta precisão de temporizadores que são executados por mais tempo do que o intervalo de sondagem, que é definido pelo RunnableInstancesDetectionPeriod. Para permitir o processamento oportuno de atrasos mais curtos, a instância do fluxo de trabalho deve permanecer na memória por pelo menos um intervalo de sondagem.

Defina TimeToPersist como 0 para gravar o tempo de expiração no banco de dados de persistência.

Defina TimeToUnload como maior ou igual a RunnableInstancesDetectionPeriod para manter a instância na memória por pelo menos um intervalo de sondagem.

Não recomendamos reduzir o RunnableInstancesDetectionPeriod porque isso leva a um aumento da carga no banco de dados de persistência. Cada host de serviço que usa as SqlWorkflowInstanceStore sondagens do banco de dados uma vez por período de deteção. A configuração RunnableInstancesDetectionPeriod para um intervalo de tempo muito pequeno pode fazer com que o desempenho do seu sistema diminua se o número de hosts de serviço for grande.

Configurando o repositório de instâncias do fluxo de trabalho SQL

O Repositório de Instâncias do Fluxo de Trabalho SQL tem os seguintes parâmetros de configuração:

InstanceEncodingOption
Este parâmetro instrui o SqlWorkflowInstanceStore a compactar o estado da instância do fluxo de trabalho. A compactação reduz a quantidade de dados armazenados no banco de dados de persistência e reduz o tráfego de rede caso o banco de dados de persistência resida em um servidor de banco de dados dedicado. Se a compactação for usada, ela exigirá recursos computacionais para compactar e extrair o estado da instância. Na maioria dos casos, a compressão produz maior desempenho.

InstanceCompletionAction
Este parâmetro instrui o SqlWorkflowInstanceStore a manter ou excluir instâncias concluídas. Manter instâncias concluídas aumenta os requisitos de armazenamento do banco de dados de persistência e leva a tabelas maiores, o que aumenta os tempos de pesquisa de tabelas. A menos que instâncias concluídas sejam necessárias para depuração ou auditoria, é melhor instruir o SqlWorkflowInstanceStore para excluir instâncias concluídas. As instâncias excluídas devem ser mantidas somente se o usuário estabelecer um processo para eventualmente removê-las. Observe que as chaves de correlação não podem ser reutilizadas desde que a instância de fluxo de trabalho concluída resida no armazenamento de instâncias.

RunnableInstancesDetectionPeriod
Esse parâmetro define o intervalo máximo com o qual sonda SqlWorkflowInstanceStore o banco de dados de persistência para instâncias que devem ser carregadas quando uma Delay atividade expira. Se encontrar SqlWorkflowInstanceStore um temporizador que expirará no próximo intervalo de sondagem, ele encurta o intervalo de sondagem para que a próxima sondagem ocorra logo após o temporizador expirar. Dessa forma, o Repositório de Instâncias do Fluxo de Trabalho SQL alcança uma alta precisão de temporizadores que são executados por mais tempo do RunnableInstancesDetectionPeriodque o .

Não recomendamos reduzir o RunnableInstancesDetectionPeriod, porque isso leva a um aumento da carga no banco de dados de persistência. Cada host de serviço que usa as SqlWorkflowInstanceStore sondagens do banco de dados uma vez por período de deteção. A configuração RunnableInstancesDetectionPeriod para um intervalo muito pequeno pode fazer com que o desempenho do seu sistema diminua se o número de hosts de serviço for grande.

HostLockRenewalPeriod
Este parâmetro define o intervalo com o qual o host renova seu bloqueio no banco de dados de persistência. Encurtar esse intervalo permitirá uma recuperação mais rápida das instâncias do fluxo de trabalho caso um host ou computador falhe. Por outro lado, um curto período de renovação de bloqueio aumenta a carga no banco de dados de persistência. Cada host de serviço que usa o SqlWorkflowInstanceStore atualizará seus bloqueios no banco de dados uma vez por período de renovação. Se um computador executar muitos hosts de serviço, certifique-se de que a carga causada pela renovação de bloqueio não diminua o desempenho do sistema. Se isso acontecer, considere aumentar o HostLockRenewalPeriod.

InstanceLockedExceptionAction
Se habilitado, as SqlWorkflowInstanceStore tentativas novamente para carregar uma instância bloqueada pelos próximos 30 segundos. Defina InstanceLockedExceptionAction como BasicRetry ou AggressiveRetry se o fluxo de trabalho receber várias mensagens em um curto espaço de tempo e essas mensagens forem recebidas por computadores diferentes.

Como o mecanismo de repetição de carga não introduz nenhuma sobrecarga de desempenho, desde que novas tentativas de carga não sejam tentadas, InstanceLockedExceptionAction deve sempre ser habilitado.