Proveedores de coherencia de registros
El paquete Microsoft.Orleans.EventSourcing
incluye varios proveedores de coherencia de registros que cubren escenarios básicos adecuados para empezar y permiten cierta extensibilidad.
Almacenamiento de estado
Orleans.EventSourcing.StateStorage.LogConsistencyProvider almacena instantáneas de estado de grano, mediante un proveedor de almacenamiento estándar que se puede configurar de forma independiente.
Los datos que se mantienen en el almacenamiento son un objeto que contiene el estado de grano (especificado por el primer parámetro de tipo en JournaledGrain
) y algunos metadatos (el número de versión y una etiqueta especial que se usa para evitar la duplicación de eventos cuando se produce un error en el acceso de almacenamiento).
Dado que todo el estado de grano es de lectura y escritura cada vez que accedemos al almacenamiento, este proveedor no es adecuado para objetos cuyo estado de grano es muy grande.
Este proveedor no admite RetrieveConfirmedEvents, no puede recuperar los eventos del almacenamiento porque los eventos no se conservan.
Almacenamiento de registros
Orleans.EventSourcing.LogStorage.LogConsistencyProvider almacena la secuencia de eventos completa como un único objeto, mediante un proveedor de almacenamiento estándar que se puede configurar de forma independiente.
Los datos que se mantienen en el almacenamiento son un objeto que contiene un List<EventType> object
y algunos metadatos (una etiqueta especial que se usa para evitar la duplicación de eventos cuando se produce un error en el acceso de almacenamiento).
Este proveedor admite RetrieveConfirmedEvents. Todos los eventos siempre están disponibles y se mantienen en memoria.
Dado que toda la secuencia de eventos se lee y escribe cada vez que accedemos al almacenamiento, este proveedor no es adecuado para su uso en producción, a menos que se garantice que las secuencias de eventos permanezcan bastante cortas. El propósito principal de este proveedor es ilustrar la semántica del aprovisionamiento de eventos y para ejemplos o entornos de prueba.
Almacenamiento personalizado
Orleans.EventSourcing.CustomStorage.LogConsistencyProvider permite al desarrollador conectar su interfaz de almacenamiento, a la que llama el protocolo de coherencia en los momentos adecuados. Este proveedor no realiza suposiciones específicas sobre si lo que se almacena son instantáneas de estado o eventos: el programador asume el control sobre esa opción (y puede almacenar uno o ambos).
Para usar este proveedor, un grano debe derivarse de JournaledGrain<TGrainState,TEventBase>, como antes, pero también debe implementar la siguiente interfaz:
public interface ICustomStorageInterface<StateType, EventType>
{
Task<KeyValuePair<int, StateType>> ReadStateFromStorage();
Task<bool> ApplyUpdatesToStorage(
IReadOnlyList<EventType> updates,
int expectedVersion);
}
El proveedor de coherencia espera que se comporten de una manera determinada. Los programadores deben tener en cuenta lo siguiente:
Se espera que el primer método, ReadStateFromStorage, devuelva la versión y el estado leído. Si aún no hay nada almacenado, debe devolver cero para la versión y un estado que coincida con el constructor predeterminado para
StateType
.ApplyUpdatesToStorage debe devolver falso si la versión esperada no coincide con la versión real (esto es análogo a una comprobación de etiqueta electrónica).
Si
ApplyUpdatesToStorage
falla con una excepción, el proveedor de coherencia vuelve a intentarlo. Esto significa que algunos eventos se pueden duplicar si se produce una excepción de este tipo, pero el evento se ha conservado. El desarrollador es responsable de asegurarse de que esto es seguro: por ejemplo, evite este caso al no iniciar una excepción o asegúrese de que los eventos duplicados sean inofensivos para la lógica de la aplicación o agregue algún mecanismo adicional para filtrar duplicados.
Este proveedor no admite RetrieveConfirmedEvents
. Por supuesto, dado que el desarrollador controla la interfaz de almacenamiento de todos modos, no es necesario llamar a esto en primer lugar, pero puede implementar su recuperación de eventos.