Instance Locked Exception Action
La proprietà InstanceLockedExceptionAction dell'Archivio di istanze del flusso di lavoro SQL consente di specificare l'azione che il provider di persistenza SQL deve eseguire quando riceve un'eccezione InstanceLockedException. Il provider di persistenza riceve questa eccezione quando tenta di bloccare un'istanza del servizio flusso di lavoro che è attualmente bloccata da un altro host del servizio. I valori di questa proprietà sono NoRetry, BasicRetry e AggressiveRetry. Il valore predefinito è NoRetry. Nell'elenco seguente vengono descritte le tre opzioni:
NoRetry. L'host del servizio non tenta di bloccare l'istanza del servizio flusso di lavoro e passa al InstanceLockedException chiamante. Se il flusso di lavoro rimane in memoria per un periodo superiore a 60 secondi, usare NoRetry come tentativo. Il valore predefinito è NoRetry.
BasicRetry. L'host del servizio tenta di nuovo di bloccare l'istanza con un intervallo lineare tra tentativi e passa InstanceLockedException al chiamante alla fine della sequenza. Se il flusso di lavoro rimane in memoria approssimativamente tra i 5 e 60 secondi e i messaggi arrivano in batch, per cui è più probabile che i messaggi siano inviati alla stessa istanza nello stesso host per elaborare tutti i messaggi prima di scaricare il flusso di lavoro, usare BasicRetry per ottenere la migliore latenza senza sprecare risorse.
AggressiveRetry. L'host del servizio tenta di nuovo di bloccare l'istanza di servizio del flusso di lavoro con un intervallo di interruzione esponenziale tra tentativi e passa l'eccezione al chiamante alla fine della sequenza. Se il flusso di lavoro rimane in memoria per un tempo molto breve (meno di 5 secondi) o una Web farm è grande e la probabilità che un altro messaggio sia recapitato allo stesso host non è molto elevata, usare AggressiveRetry per ottenere la migliore latenza.
La funzionalità Instance Locked Exception Action supporta gli scenari seguenti. In tutti gli scenari, se la proprietà instanceLockedExceptionAction dell'oggetto SqlWorkflowInstanceStore viene impostata su BasicRetry o AggressiveRetry, l'host tenta di nuovo di acquisire periodicamente e in modo trasparente il blocco sulle istanze.
Abilitazione dell'arresto normale e del riciclo sovrapposto di domini dell'applicazione. Si supponga che un AppDomain con un host di servizio che esegue istanze del servizio flusso di lavoro venga riciclato e venga generato un nuovo AppDomain per gestire nuove richieste in parallelo mentre il vecchio AppDomain viene ridotto in modo normale. L'arresto attende finché le istanze del servizio flusso di lavoro non sono inattive, quindi le istanze vengono rese persistenti e scaricate. Eventuali tentativi da parte degli host nel nuovo AppDomain per bloccare un'istanza causeranno un InstanceLockedExceptionoggetto .
Ridimensionamento orizzontale dei flussi di lavoro durevoli in una farm omogenea di server. Si supponga che un nodo di una server farm in cui è in esecuzione un'istanza del flusso di lavoro venga arrestato in modo anomalo e l'host del flusso di lavoro non possa rimuovere i blocchi sull'istanza che sta eseguendo. Quando un host del servizio che è in esecuzione in un altro nodo della farm riceve un messaggio per l'istanza di quel flusso di lavoro, tenta di acquisire i blocchi su queste istanze e riceverà l'eccezione InstanceLockedException. I blocchi scadranno dopo un po' di tempo perché l'host che doveva rinnovare il blocco non esiste più.
Ridimensionamento orizzontale dei flussi di lavoro durevoli in una farm omogenea di server. Si supponga di voler ridimensionare orizzontalmente un flusso di lavoro durevole usando più host in un bilanciamento del carico di rete (NLB), che l'host del flusso di lavoro in esecuzione in un nodo della farm carichi un'istanza del flusso di lavoro e stia elaborando un messaggio e che il successivo messaggio all'istanza venga indirizzato all'host in esecuzione in un altro nodo perché il bilanciamento del carico di rete non dispone dell'algoritmo di routing per recapitare i messaggi all'host che sta già eseguendo l'istanza. Dopo la ricezione del messaggio, il secondo host tenta di caricare l'istanza del flusso di lavoro e riceve l'eccezione InstanceLockedException perché il primo host dispone di un blocco sull'istanza. Il primo host sblocca l'istanza quando l'elaborazione del primo messaggio è finita e il secondo host acquisisce il blocco quando ritenta la volta successiva, carica l'istanza ed elabora il secondo messaggio.