Orleans 2.0官方文档(闫辉的个人翻译)——4.9.7 内置的日志一致性提供程序

内置的日志一致性提供程序

Microsoft.Orleans.EventSourcing包,包含了几个日志一致性提供程序,它们涵盖了适合入门的基本方案,并允许一些扩展性。

Orleans.EventSourcing.StateStorage.LogConsistencyProvider

此提供程序使用可以独立配置的标准存储提供程序,存储grain状态的快照

保存在存储中的数据是一个对象,它既包含grain状态(由第一个类型参数指定JournaledGrain),又包含一些元数据(版本号,以及一个特殊的标记,用于在存储访问失败时避免事件重复。)。

由于每次访问存储时都会读取/写入整个grain的状态,因此该提供程序不适用于grain状态非常大的对象。

此提供程序不支持RetrieveConfirmedEvents;它无法从存储中检索事件,因为事件不是持久化的。

Orleans.EventSourcing.LogStorage.LogConsistencyProvider

此提供程序使用可以单独配置的标准存储提供程序,将完整的事件序列存储为单个对象

存储中保存的数据是一个对象,它包含一个List<EventType> object和一些元数据(一个特殊标记,用于在存储访问失败时避免事件重复)。

该提供程序的确支持RetrieveConfirmedEvents。所有事件始终可用,并保存在内存中。

由于每次访问存储时都会读取/写入整个事件序列,因此该提供程序不适合用于生产环境,除非事件序列能保证非常短。此提供程序的主要目的是,阐明事件溯源的语义,以及用于示例/测试环境。

Orleans.EventSourcing.CustomStorage.LogConsistencyProvider

此提供程序允许开发人员插入自己的存储接口,然后在适当的时候,由一致性协议调用该接口。此提供程序不会对存储的内容是状态快照还是事件做出特定的假设——开发人员假定对该选择拥有控制权(并且可以存储其中一个或两个)。

要使用此提供程序,像之前一样,grain必须继承自JournaledGrain<StateType,EventType>,另外还必须实现以下接口:

public interface ICustomStorageInterface<StateType, EventType>
{
   Task<KeyValuePair<int,StateType>> ReadStateFromStorage();

   Task<bool> ApplyUpdatesToStorage(IReadOnlyList<EventType> updates, int expectedversion);
}

一致性提供程序期望这些行为以某种方式运行。开发人员应该意识到:

  • 第一种方法,ReadStateFromStorage,应该返回版本和读取的状态。如果尚未存储任何内容,则对于版本,它应返回零,并且匹配的状态对应于StateType的默认构造函数。

  • 如果预期版本与实际版本不匹配,则ApplyUpdatesToStorage 必须返回false(这类似于电子标签检查)。

  • 如果ApplyUpdatesToStorage失败并出现异常,则一致性提供程序将重试。这意味着,如果抛出这样的异常,某些事件可能会被复制,但该事件实际上已持久化。开发人员负责确保这是安全的:例如,通过不抛出异常来避免这种情况,或者确保重复事件对应用程序逻辑无害,或者添加一些额外的机制来过滤重复的事件。

此提供程序不支持RetrieveConfirmedEvents。当然,不管怎么说,由于开发人员控制着存储接口,因此他们不需要首先调用它,而是可以实现它们自己的事件检索。

猜你喜欢

转载自blog.csdn.net/uddiqpl/article/details/86438635