Compartilhar via


Práticas recomendadas de persistência

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

Design e implementação de fluxos de trabalho duráveis

Em geral, os fluxos de trabalho executam trabalhos em curtos períodos intercalados com horários durante os quais o fluxo de trabalho está ocioso porque está aguardando um evento. Esse evento pode ser algo como uma mensagem ou um temporizador expirando. Para poder descarregar o fluxo de trabalho métodos como exemplo quando fica ocioso, o serviço que o host deve manter a instância de fluxo de trabalho. Isso só será possível se a instância de 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 somente para ações de curta duração. Em particular, o autor deve manter atividades de atraso nesses sem para persistir as zonas tão curto como possível.

Um fluxo de trabalho só poderá ser mantido 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 ser persistido por SqlWorkflowInstanceStore.

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

Se seu fluxo de trabalho é muito ocupado por tempo, recomendamos que você persistir a instância de fluxo de trabalho regularmente ao longo do seu período ocupado. Você pode fazer isso adicionando Persist atividades ao longo da sequência de atividades que mantêm a instância do fluxo de trabalho ocupada. Dessa forma, a reciclagem do domínio do aplicativo, falhas de host ou falhas no computador não fazem com que o sistema volte ao início do período de atividade intensa. Lembre-se de que adicionar Persist atividades ao 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 maneira, 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 ficarem 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 ao longo de 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 atividades de Persist ou TimeToPersist definido como 0 para ativar a recuperação de sua instância de fluxo de trabalho depois que falhas de host ou do computador de serviço.

Cenário: as instâncias de fluxo de trabalho ficam ociosas por longos períodos de tempo

Nesse cenário, defina TimeToUnload como 0 para liberar recursos assim que 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 durante o suficiente tiempo.

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 de 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, SqlWorkflowInstanceStore sonda regularmente o base de dados de persistência para as instâncias que devem ser carregadas devido a uma atividade expirada de Delay . Se o SqlWorkflowInstanceStore encontrar um temporizador que expirará no próximo intervalo de sondagem, o Repositório de Instâncias de Fluxo de Trabalho do SQL encurtará o intervalo de sondagem. A próxima votação ocorrerá logo após o temporizador expirar. Dessa forma, o Repositório de Instâncias de Fluxo de Trabalho do SQL obtém uma alta precisão de temporizadores que funcionam por mais tempo do que o intervalo de sondagem, que é definido por RunnableInstancesDetectionPeriod. Para ativar o processamento hábil de um atrasos mais curtas, a instância de fluxo de trabalho deve permanecer na memória pelo menos um intervalo de pesquisa.

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 a fim de manter a instância na memória por pelo menos um intervalo de sondagem.

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

Configurando o Repositório de Instâncias de Fluxo de Trabalho do SQL

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

InstanceEncodingOption
Esse parâmetro instrui a SqlWorkflowInstanceStore a comprimir 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 compactação gera um desempenho maior.

InstanceCompletionAction
Esse parâmetro instrui a SqlWorkflowInstanceStore a manter ou excluir as 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 da tabela. A menos que as instâncias concluídas são necessárias depuração ou auditando, é melhor instruir SqlWorkflowInstanceStore para excluir instâncias concluídas. As instâncias excluídas só deverão ser mantidas se o usuário estabelecer um processo para removê-las eventualmente. Note que as chaves de correlação não podem ser reutilizadas desde que a instância de fluxo de trabalho concluída resida no repositório de instâncias.

RunnableInstancesDetectionPeriod
Esse parâmetro define o intervalo máximo com o qual o SqlWorkflowInstanceStore banco de dados de persistência deve ser sondado para instâncias que devem ser carregadas quando uma Delay atividade expira. Se encontrar SqlWorkflowInstanceStore um temporizador que expirará no próximo intervalo de votação, ele reduzirá o intervalo de votação para que a próxima votação ocorra logo após o temporizador expirar. Essa maneira, a instância Store de fluxo de trabalho do SQL obtém uma alta precisão de temporizadores que executam mais tempo de RunnableInstancesDetectionPeriod.

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 o SqlWorkflowInstanceStore consulta o banco de dados uma vez por período de detecção. A configuração RunnableInstancesDetectionPeriod para um intervalo muito pequeno pode fazer com que o desempenho do sistema diminua se o número de hosts de serviço for grande.

HostLockRenewalPeriod
Esse parâmetro define o intervalo com o qual o host renova seu bloqueio no banco de dados de persistência. Reduzir esse intervalo habilitará uma recuperação mais rápida das instâncias de fluxo de trabalho caso um host ou computador falhe. Por outro lado, um período de renovação de bloqueio curto 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 executa muitos host serviço, certifique-se de que a carga causada pela renovação de bloqueio não reduz o desempenho do sistema. Se isso acontecer, considere aumentar o HostLockRenewalPeriod.

InstanceLockedExceptionAction
Se habilitado, SqlWorkflowInstanceStore tenta carregar uma instância bloqueada nos próximos 30 segundos. Defina InstanceLockedExceptionAction como BasicRetry ou AggressiveRetry se o fluxo de trabalho receber várias mensagens em pouco 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 as novas tentativas de carga não sejam tentadas, InstanceLockedExceptionAction sempre deve ser habilitado.