Persistenza e motore di orchestrazione
La persistenza dello stato e la relativa gestione e ripristino costituiscono la base per molte funzionalità fondamentali del motore di orchestrazione. In particolare, la persistenza è di fondamentale importanza per il corretto funzionamento di:
Disidratazione e riattivazione
Reidratazione ed esecuzione agnostica del computer
Modello di compensazione
Arresto controllato del sistema
Ripristino
Il motore di orchestrazione salva nell'archivio permanente l'intero stato di un'istanza di orchestrazione in esecuzione in corrispondenza di vari punti, in modo che l'istanza possa essere completamente ripristinata in memoria. Lo stato include:
Lo stato interno del motore, incluso lo stato di avanzamento corrente.
Lo stato di eventuali componenti .NET che conservano informazioni sullo stato e che vengono utilizzati dall'orchestrazione.
Valori di messaggi e variabili.
Punti di persistenza
Il motore di orchestrazione salva lo stato dell'istanza di orchestrazione in esecuzione in corrispondenza di vari punti. Se deve riattivare l'istanza di orchestrazione, eseguire l'avvio da un arresto controllato o recuperare un arresto imprevisto, eseguirà l'istanza di orchestrazione a partire dall'ultimo punto di persistenza, come se non fosse accaduto nient'altro. Se, ad esempio, viene ricevuto un messaggio ma si verifica un arresto imprevisto prima che lo stato possa essere salvato, il motore non registrerà di aver ricevuto il messaggio e lo riceverà di nuovo al riavvio. Il motore salva lo stato di un'orchestrazione nelle seguenti circostanze:
Viene raggiunta la fine di un ambito transazionale.
Il motore salva lo stato alla fine di un ambito transazionale in modo da definire senza ambiguità il punto da cui deve venire ripresa l'orchestrazione e, quindi, se necessario, poter eseguire la compensazione senza errori.
L'orchestrazione viene eseguita dalla fine dell'ambito se la persistenza non presentava errori. In caso contrario viene chiamato il gestore di eccezioni appropriato.
Se l'ambito è transazionale e atomico, il motore salverà lo stato al termine di tale ambito quando esegue il commit.
Se l'ambito è transazionale e con esecuzione prolungata, il motore genera una nuova transazione e rende persistente lo stato completo del runtime al termine dell'ambito.
Viene raggiunto un punto di interruzione di debug.
Viene inviato un messaggio. L'unica eccezione è quando un messaggio viene inviato da un ambito di transazione atomico.
L'orchestrazione avvia un'altra orchestrazione in modo asincrono, come con la forma Start Orchestration .
L'istanza di orchestrazione è sospesa.
Quando viene richiesto l'arresto del motore di orchestrazione, il motore tenta di salvare le informazioni del controllo nonché lo stato corrente di tutte le istanze di orchestrazione in esecuzione, in modo da poter riprendere l'esecuzione quando verrà riavviato. Se il motore non è in grado di salvare correttamente lo stato corrente, l'istanza di orchestrazione verrà ripresa dall'ultimo punto di persistenza registrato prima dell'arresto. Ciò è applicabile in caso di arresto del sistema in condizioni controllate, nonché in caso di interruzioni anomale.
Il motore determina che l'istanza deve essere disidratata.
L'istanza di orchestrazione finisce.
Serializzazione
Per poter rendere persistente lo stato dell'orchestrazione, è necessario che tutte le istanze di oggetti a cui l'orchestrazione fa riferimento in modo diretto o indiretto (tramite altri oggetti) siano serializzabili. Sussistono due eccezioni:
In una transazione atomica può essere dichiarato un oggetto non serializzabile. Questo è possibile perché gli ambiti atomici non contengono punti di persistenza.
System.Xml.XmlDocument non è una classe serializzabile, viene gestita come caso speciale e può essere utilizzata ovunque.
Attenzione
Per poter rendere persistente un oggetto .NET, è necessario contrassegnarlo come serializzabile.
Nota
Non è possibile rendere persistenti gli oggetti COM mediante procedure di serializzazione .NET standard. Se si desidera chiamare un oggetto COM all'esterno di una transazione atomica, è necessario racchiudere l'oggetto COM in un oggetto .NET che possa essere serializzato mediante .NET e possa rendere persistente e ripristinare lo stato dell'oggetto COM.
Arresto del sistema
Quando viene richiesto l'arresto del motore di orchestrazione, il motore tenta di salvare le informazioni del controllo nonché lo stato corrente di tutte le istanze di orchestrazione in esecuzione, in modo da poter riprendere l'esecuzione quando verrà riavviato. Se il motore non è in grado di salvare correttamente lo stato corrente, l'istanza di orchestrazione verrà ripresa dall'ultimo punto di persistenza registrato prima dell'arresto. Ciò è applicabile in caso di arresto del sistema in condizioni controllate, nonché in caso di interruzioni anomale.
Ripristino
Il motore salva con regolarità nell'archivio permanente le informazioni sullo stato di un'istanza di orchestrazione, anche nel caso di un arresto del sistema.
Quando l'esecuzione di un'istanza di orchestrazione viene interrotta in modo anomalo per qualsiasi motivo, l'istanza può essere ripristinata sulla base dell'ultimo stato reso persistente e l'esecuzione può proseguire come se non si fosse verificata alcuna interruzione. Ciò è valido anche se il server originale in cui era in esecuzione l'istanza è fuori servizio per un motivo qualsiasi poiché l'esecuzione può semplicemente essere ripresa in un altro computer. Grazie a questo modello di ripristino multiserver, il clustering non è più necessario.