该 Microsoft.Orleans.EventSourcing
包包含多个日志一致性提供程序,涵盖适用于入门的基本方案并允许某些扩展性。
状态存储
Orleans.EventSourcing.StateStorage.LogConsistencyProvider 使用一个可以独立配置的标准存储提供程序来存储 粒度状态快照。
存储在存储中的数据是一个对象,其中包含粒度状态(由第一个类型参数指定) JournaledGrain
和某些元数据(版本号和特殊标记,用于避免存储访问失败时发生事件重复)。
由于每次访问存储时都会读取/写入整个粒度状态,因此此提供程序不适用于具有非常大粒度状态的对象。
此提供程序不支持 RetrieveConfirmedEvents。 它无法从存储中检索事件,因为事件不会持久化。
日志存储
可以使用一个独立配置的标准存储提供程序,将Orleans.EventSourcing.LogStorage.LogConsistencyProvider完整的事件序列存储为单个对象。
存储在存储中的数据是包含 List<EventType>
对象和某些元数据的对象(用于避免存储访问失败时发生事件重复的特殊标记)。
此提供商支持 RetrieveConfirmedEvents。 所有事件始终可用,并保存在内存中。
由于每次访问存储时都会读取/写入整个事件序列,因此此提供程序 不适合生产使用 ,除非保证事件序列保持相当短。 此提供程序的主要用途是说明事件溯源的语义,并用于示例/测试环境。
自定义存储
这样 Orleans.EventSourcing.CustomStorage.LogConsistencyProvider ,便可以插入存储接口,然后一致性协议会在适当时间调用该接口。 此提供程序不对存储的数据是否包含状态快照或事件做出具体假设 - 你假设控制该选择(并且可以存储任一或两者)。
若要使用此提供程序,粒子必须像以前一样从JournaledGrain<TGrainState,TEventBase>继承,并且还必须实现以下接口:
public interface ICustomStorageInterface<StateType, EventType>
{
Task<KeyValuePair<int, StateType>> ReadStateFromStorage();
Task<bool> ApplyUpdatesToStorage(
IReadOnlyList<EventType> updates,
int expectedVersion);
}
一致性提供程序要求这些方法以某种方式运行。 请注意:
第一种方法 ReadStateFromStorage应同时返回版本和状态读取。 如果尚未存储任何内容,则它应为版本返回零,并返回对应于默认构造函数的状态
StateType
。ApplyUpdatesToStorage 如果预期的版本与实际版本不匹配(这类似于电子标记检查),则必须返回
false
。如果
ApplyUpdatesToStorage
失败并出现异常,则一致性提供程序会重试。 这意味着,如果引发此类异常,但事件已被持久化,则某些事件可能会被重复。 你负责确保这一点是安全的:例如,通过不引发异常来避免这种情况,确保重复事件对应用程序逻辑无害,或者添加额外的机制来筛选重复项。
此提供程序不支持 RetrieveConfirmedEvents
。 当然,由于无论如何都控制存储接口,因此不需要首先调用此方法,但可以实现事件检索逻辑。