Procedure consigliate per la persistenzaPersistence Best Practices

In questo documento vengono descritte le procedure consigliate per la progettazione e la configurazione del flusso di lavoro al fine di mantenerne la persistenza.This document covers best practices for workflow design and configuration related to workflow persistence.

Progettazione e implementazione di flussi di lavoro durevoliDesign and Implementation of Durable Workflows

In generale, in un flusso di lavoro le attività vengono eseguite in periodi brevi separati da intervalli durante i quali il flusso di lavoro è inattivo perché in attesa di un evento,In general, workflows perform work in short periods that are interleaved with times during which the workflow is idle because it is waiting for an event. ad esempio un messaggio o la scadenza di un timer.This event can be such things as a message or an expiring timer. Per essere in grado di scaricare l'istanza del flusso di lavoro quando diventa inattiva, l'host del servizio deve renderla persistente.To be able to unload the workflow instance when it becomes idle, the service host must persist the workflow instance. Questa operazione è possibile solo se l'istanza del flusso di lavoro non si trova in un'area di non persistenza, ad esempio in attesa di un callback asincrono o del completamento di una transazione.This is possible only if the workflow instance is not in a no-persist zone (for example, waiting for a transaction to complete, or waiting for an asynchronous callback). Per consentire a un'istanza del flusso di lavoro inattiva di essere scaricata, l'autore del flusso di lavoro deve usare ambiti di transazione e attività asincrone solo per azioni di breve durata.To allow an idle workflow instance to unload, the workflow author should use transaction scopes and asynchronous activities for short-lived actions only. In particolare, le attività di ritardo all'interno di tali aree di non persistenza devono essere le più brevi possibili.In particular, the author should keep delay activities within these no-persist zones as short as possible.

Un flusso di lavoro può essere reso persistente solo se tutti i tipi di dati usati sono serializzabili.A workflow can only be persisted if all of the data types used by the workflow are serializable. I tipi personalizzati usati in flussi di lavoro persistenti, inoltre, devono essere serializzabili tramite NetDataContractSerializer per essere resi persistenti da SqlWorkflowInstanceStore.In addition, custom types used in persisted workflows must be serializable with NetDataContractSerializer in order to be persisted by SqlWorkflowInstanceStore.

Se un'istanza del flusso di lavoro non è stata resa persistente, non è possibile recuperarla in caso in cui si verifichi un errore nell'host o nel computer.A workflow instance cannot be recovered in case of a host or computer failure if it has not been persisted. In generale, si consiglia di rendere subito persistente un'istanza del flusso di lavoro nel relativo ciclo di vita.In general, we recommend that you persist a workflow instance early in the workflow’s life cycle.

Se il flusso di lavoro è occupato per un periodo di tempo prolungato, si consiglia di rendere persistente la relativa istanza regolarmente durante tutto il periodo.If your workflow is busy for a long time, we recommend that you persist the workflow instance regularly throughout its busy period. A tale scopo, aggiungere le attività Persist durante tutta la sequenza di operazioni che tengono occupata l'istanza del flusso di lavoro.You can do this by adding Persist activities throughout the sequence of activities that keep the workflow instance busy. In questo modo il riciclo del dominio applicazione o eventuali errori nell'host o nel computer non provocano l'esecuzione del rollback del sistema all'inizio del periodo in cui il flusso di lavoro è occupato.In this manner, application domain recycling, host failures, or computer failures do not cause the system to be rolled back to the start of the busy period. Tenere presente che l'aggiunta di attività Persist al flusso di lavoro potrebbe provocare una riduzione delle prestazioni.Be aware that adding Persist activities to your workflow could lead to a degradation of performance.

Windows Server AppFabric consente di semplificare notevolmente la configurazione e l'uso della persistenza.Windows Server App Fabric greatly simplifies the configuration and use of persistence. Per altre informazioni, vedere la persistenza dell'infrastruttura di App di Windows ServerFor more information, see Windows Server App Fabric Persistence

Configurazione dei parametri di scalabilitàConfiguration of Scalability Parameters

I requisiti relativi alla scalabilità e alle prestazione determinano le impostazioni dei parametri seguenti:Scalability and performance requirements determine the settings of the following parameters:

In base allo scenario corrente, tali parametri dovrebbero essere impostati nel modo indicato di seguito.These parameters should be set as follows, according to the current scenario.

Scenario: presenza di un numero ridotto di istanze del flusso di lavoro che richiedono un tempo di risposta ottimaleScenario: A Small Number of Workflow Instances That Require Optimal Response Time

In questo scenario tutte le istanze del flusso di lavoro devono rimanere caricate quando diventano inattive.In this scenario, all workflow instances should remain loaded when they become idle. Impostare TimeToUnload su un valore elevato.Set TimeToUnload to a large value. Questa impostazione consente di impedire che un'istanza del flusso di lavoro si sposti tra computer.The use of this setting prevents a workflow instance from moving between computers. Usare questa impostazione solo se si verifica una o più delle condizioni seguenti:Use this setting only if one or more of the following are true:

  • Un'istanza del flusso del lavoro riceve un unico messaggio in tutta la durata.A workflow instance receives a single message throughout its lifetime.

  • Tutte le istanze del flusso di lavoro vengono eseguite in un unico computer.All workflow instances run on a single computer

  • Tutti i messaggi ricevuti da un'istanza del flusso di lavoro vengono recapitati nello stesso computer.All messages that are received by a workflow instance are received by the same computer.

Usare attività Persist o impostare TimeToPersist su 0 per abilitare il recupero dell'istanza del flusso di lavoro dopo eventuali errori dell'host del servizio o del computer.Use Persist activities or set TimeToPersist to 0 to enable recovery of your workflow instance after service host or computer failures.

Scenario: inattività delle istanze del flusso di lavoro per periodi di tempo prolungatiScenario: Workflow Instances Are Idle for Long Periods of Time

In questo scenario impostare TimeToUnload su 0 per rilasciare le risorse il prima possibile.In this scenario, set TimeToUnload to 0 to release resources as soon as possible.

Scenario: le istanze del flusso di lavoro ricevono più messaggi in un breve periodo di tempoScenario: Workflow Instances Receive Multiple Messages in a Short Period of Time

In questo scenario impostare TimeToUnload su 60 secondi se i messaggi vengono ricevuti dallo stesso computer.In this scenario, set TimeToUnload to 60 seconds if these messages are received by the same computer. In questo modo si impedisce che un'istanza del flusso di lavoro venga scaricata e caricata rapidamenteThis prevents a rapid sequence of unloading and loading of a workflow instance. e che l'istanza rimanga in memoria per un periodo di tempo eccessivo.This also does not keep the instance in memory for too long.

Impostare TimeToUnload su 0 e InstanceLockedExceptionAction su BasicRetry o AggressiveRetry se tali messaggi possono essere ricevuti da computer diversi.Set TimeToUnload to 0, and set InstanceLockedExceptionAction to BasicRetry or AggressiveRetry if these messages may be received by different computers. In questo modo l'istanza del flusso di lavoro può essere caricata da un altro computer.This allows the workflow instance to be loaded by another computer.

Scenario: il flusso di lavoro usa le attività di ritardo con durate breviScenario: Workflow Uses Delay Activities with Short Durations

In questo scenario SqlWorkflowInstanceStore esegue regolarmente il polling sul database di persistenza per istanze che devono essere caricate a causa di un'attività Delay scaduta.In this scenario, the SqlWorkflowInstanceStore regularly polls the persistence database for instances that should be loaded because of an expired Delay activity. Se SqlWorkflowInstanceStore trova un timer che scadrà nell'intervallo di polling successivo, l'archivio di istanze del flusso di lavoro SQL riduce l'intervallo di polling.If the SqlWorkflowInstanceStore finds a timer that will expire in the next polling interval, the SQL Workflow Instance Store shortens the polling interval. Il polling successivo verrà eseguito subito dopo la scadenza del timer.The next poll will then occur right after the timer has expired. In questo modo si ottiene un'elevata precisione per i timer in esecuzione da più tempo rispetto all'intervallo di polling, impostato da RunnableInstancesDetectionPeriod.This way, the SQL Workflow Instance Store achieves a high accuracy of timers that run longer than the polling interval, which is set by RunnableInstancesDetectionPeriod. Per abilitare un'elaborazione corretta di ritardi più brevi, l'istanza del flusso di lavoro deve rimanere in memoria almeno per la durata di un intervallo di polling.To enable timely processing of shorter delays, the workflow instance must remain in memory for at least one polling interval.

Impostare TimeToPersist su 0 per scrivere la scadenza nel database di persistenza.Set TimeToPersist to 0 to write the expiration time to the persistence database.

Impostare TimeToUnload su un valore maggiore o uguale a RunnableInstancesDetectionPeriod per mantenere l'istanza in memoria almeno per la durata di un intervallo di polling.Set TimeToUnload to longer than or equal to RunnableInstancesDetectionPeriod to keep the instance in memory for at least one polling interval.

Si consiglia di non ridurre il valore di RunnableInstancesDetectionPeriod per non aumentare il carico sul database di persistenza.We do not recommend reducing the RunnableInstancesDetectionPeriod because this leads to an increased load on the persistence database. Ogni host del servizio che usa SqlWorkflowInstanceStore esegue il polling sul database una volta per periodo del rilevamento.Each service host that uses the SqlWorkflowInstanceStore polls the database one time per detection period. Se si imposta RunnableInstancesDetectionPeriod su un intervallo di tempo troppo breve, le prestazioni del sistema potrebbero diminuire nel caso in cui il numero di host del servizio sia elevato.Setting RunnableInstancesDetectionPeriod to too small a time interval may cause your system's performance to decrease if the number of service hosts is large.

Configurazione dell'archivio di istanze del flusso di lavoro SQLConfiguring the SQL Workflow Instance Store

All'archivio di istanze del flusso di lavoro SQL sono associati i parametri di configurazione seguenti:The SQL Workflow Instance Store has the following configuration parameters:

InstanceEncodingOption
Questo parametro indica a SqlWorkflowInstanceStore di comprimere lo stato dell'istanza del flusso di lavoro.This parameter instructs the SqlWorkflowInstanceStore to compress the workflow instance state. La compressione consente di ridurre la quantità di dati archiviata nel database di persistenza e di diminuire il traffico di rete nel caso in cui il database di persistenza si trovi in un server database dedicato.Compression reduces the amount of data that is stored in the persistence database and reduces network traffic in case the persistence database resides on a dedicated database server. Se usata, la compressione richiede risorse computazionali per comprimere ed estrarre lo stato dell'istanza.If compression is used, it requires computational resources to compress and extract the instance state. Nella maggior parte dei casi la compressione consente di aumentare le prestazioni.In most cases, compression yields increased performance.

InstanceCompletionAction
Questo parametro indica a SqlWorkflowInstanceStore di mantenere o eliminare istanze completate.This parameter instructs the SqlWorkflowInstanceStore to either keep or delete completed instances. Se le istanze completate non vengono eliminate, i requisiti di archiviazione del database di persistenza e la dimensione delle tabelle aumentano, con un conseguente incremento dei tempi di ricerca.Keeping completed instances increases the persistence database storage requirements and leads to larger tables, which increases table lookup times. È consigliabile pertanto indicare a SqlWorkflowInstanceStore di eliminare le istanze completate, a meno che queste ultime non siano necessarie per l'esecuzione di attività di debug o di controllo.Unless completed instances are required for debugging or auditing, it is best to instruct the SqlWorkflowInstanceStore to delete completed instances. Le istanze eliminate devono essere mantenute solo se l'utente definisce un processo per l'eventuale rimozione.Deleted instances should be kept only if the user establishes a process for eventually removing them. Si noti che non è possibile riutilizzare chiavi di correlazione fino a quando l'istanza del flusso di lavoro completata è presente nell'archivio di istanze.Note that correlation keys cannot be reused as long as the completed workflow instance resides in the instance store.

RunnableInstancesDetectionPeriod
Questo parametro definisce l'intervallo massimo in base al quale SqlWorkflowInstanceStore esegue il polling sul database di persistenza per istanze che devono essere caricate quando un'attività Delay scade.This parameter defines the maximum interval with which the SqlWorkflowInstanceStore polls the persistence database for instances that should be loaded when a Delay activity expires. Se SqlWorkflowInstanceStore trova un timer che scadrà nell'intervallo di polling successivo, l'intervallo di polling verrà ridotto in modo che il polling successivo venga eseguito subito dopo la scadenza del timer.If the SqlWorkflowInstanceStore finds a timer that will expire in the next polling interval, it shortens the polling interval so that the next poll will occur right after the timer has expired. In questo modo si ottiene un'elevata precisione per i timer in esecuzione da più tempo rispetto a RunnableInstancesDetectionPeriod.This way, the SQL Workflow Instance Store achieves a high accuracy of timers that run longer than RunnableInstancesDetectionPeriod.

Si consiglia di non ridurre il valore di RunnableInstancesDetectionPeriod per non aumentare il carico sul database di persistenza.We do not recommend reducing the RunnableInstancesDetectionPeriod, because this leads to an increased load on the persistence database. Ogni host del servizio che usa SqlWorkflowInstanceStore esegue il polling sul database una volta per periodo del rilevamento.Each service host that uses the SqlWorkflowInstanceStore polls the database one time per detection period. Se si imposta RunnableInstancesDetectionPeriod su un intervallo di tempo troppo breve, le prestazioni del sistema potrebbero diminuire nel caso in cui il numero di host del servizio sia elevato.Setting RunnableInstancesDetectionPeriod to too small an interval may cause your system's performance to decrease if the number of service hosts is large.

HostLockRenewalPeriod
Questo parametro definisce l'intervallo in base al l'host rinnova il blocco nel database di persistenza.This parameter defines the interval with which the host renews its lock in the persistence database. La riduzione dell'intervallo consentirà un recupero più rapido delle istanze del flusso di lavoro in caso di errore dell'host o del computer.Shortening this interval will enable a quicker recovery of the workflow instances in case a host or computer fails. Un periodo di rinnovo del blocco più breve, tuttavia, provoca l'aumento del carico sul database di persistenza.On the other hand, a short lock renewal period increases the load on the persistence database. Ogni host del servizio che usa SqlWorkflowInstanceStore aggiornerà i blocchi nel database una volta per periodo di rinnovo.Each service host that uses the SqlWorkflowInstanceStore will update its locks in the database one time per renewal period. Se in un computer sono in esecuzione numerosi host del servizio, verificare che il carico causato dal rinnovo del blocco non diminuisca le prestazioni del sistema.If a computer runs many service hosts, make sure that the load caused by lock renewal does not decrease your system's performance. Se questo accade, provare ad aumentare il valore di HostLockRenewalPeriod.If it does, consider increasing the HostLockRenewalPeriod.

InstanceLockedExceptionAction
Se abilitato, SqlWorkflowInstanceStore tenta nuovamente di caricare un'istanza bloccata per i successivi 30 secondi.If enabled, the SqlWorkflowInstanceStore retries to load a locked instance for the next 30 seconds. Impostare InstanceLockedExceptionAction su BasicRetry o AggressiveRetry se il flusso di lavoro riceve più messaggi in un breve periodo di tempo e tali messaggi vengono recapitati in computer diversi.Set InstanceLockedExceptionAction to BasicRetry or AggressiveRetry if the workflow receives multiple messages in a short time, and these messages are received by different computers.

Poiché il meccanismo di ricaricamento non introduce alcun sovraccarico nelle prestazioni finché l'operazione non viene tentata, è necessario abilitare sempre InstanceLockedExceptionAction.Because the load retry mechanism does not introduce any performance overhead as long as load retries are not tried, InstanceLockedExceptionAction should always be enabled.