计算过程的正确性:如何设计正确的数据处理架构

事件溯源(Event Sourcing)的核心设计

基本概念

以游戏举例

多人游戏中,不管何种网络条件下,多人看到的游戏情况是一致的。

关键术语

事件溯源里有三个重要的术语:

  • 命令(command)
    • 系统收到的外部指令
    • 在游戏中,键盘操作的输入即命令
  • 事件(event)
    • 命令检查的结果是事件;
    • 只要生成了事件,则事件一定要执行。
    • move right 和 moved right 区别 (命令和事件)
  • 状态(state)
    • 事件执行结果是状态

如何处理命令和事件队列

设计核心:所有的命令或者事件的处理都要有确定的顺序

两种方式:

  • 分开存储:命令和事件均采用FIFO,同时取event和 command
  • 合并存储:获取命令,计算得到对应的事件后打包存储

如何实现队列存储

特点:顺序写,随机读 存储:使用固定大小索引文件

怎样执行事件和改变状态?

自动机

自动机,在执行事件中,不能有随机行为。

  • 不能有随机数产生
  • 不能有外来的i/o:不能有外部的输入
    • 如何确保不能有外部的输入,在加入队列中即将数据存储在事件中

时光机

由于记录了所有历史的行为,因此可以会退到某个历史时间点。

金融系统更关注的是为什么,而非是什么,架构设计倾向于记录原因

系统快照

时光机的恢复时间与事件数成正比,需要定时做系统快照;保存某个时间点的系统状态

日切行为,每日一个快照。容灾的必要性。

如何查询

采用读写分离的方式。

读采用了将事件复制,采用读模式的自动机计算做查询。

正确性的本质

  • 任何时间点的状态等于之前所有事件效果的累积
  • 自动计没有随机性
0%