日志一致性提供商

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。 当然,由于无论如何都控制存储接口,因此不需要首先调用此方法,但可以实现事件检索逻辑。