计算过程的正确性:如何设计正确的数据处理架构
目录
事件溯源(Event Sourcing)的核心设计
基本概念
以游戏举例
多人游戏中,不管何种网络条件下,多人看到的游戏情况是一致的。
关键术语
事件溯源里有三个重要的术语:
- 命令(command)
- 系统收到的外部指令
- 在游戏中,键盘操作的输入即命令
- 事件(event)
- 命令检查的结果是事件;
- 只要生成了事件,则事件一定要执行。
- move right 和 moved right 区别 (命令和事件)
- 状态(state)
- 事件执行结果是状态
graph LR; A(命令) --> |产生|B(命令) B --> |改变|C(状态) C --> |通知|Agraph LR; A(命令) --> |产生|B(命令) B --> |改变|C(状态) C --> |通知|A
如何处理命令和事件队列
设计核心:所有的命令或者事件的处理都要有确定的顺序
两种方式:
- 分开存储:命令和事件均采用FIFO,同时取event和 command
- 合并存储:获取命令,计算得到对应的事件后打包存储
如何实现队列存储
特点:顺序写,随机读 存储:使用固定大小索引文件
怎样执行事件和改变状态?
自动机
自动机,在执行事件中,不能有随机行为。
- 不能有随机数产生
- 不能有外来的i/o:不能有外部的输入
- 如何确保不能有外部的输入,在加入队列中即将数据存储在事件中
时光机
由于记录了所有历史的行为,因此可以会退到某个历史时间点。
金融系统更关注的是为什么,而非是什么,架构设计倾向于记录原因
系统快照
时光机的恢复时间与事件数成正比,需要定时做系统快照;保存某个时间点的系统状态
日切行为,每日一个快照。容灾的必要性。
如何查询
采用读写分离的方式。
读采用了将事件复制,采用读模式的自动机计算做查询。
正确性的本质
- 任何时间点的状态等于之前所有事件效果的累积
- 自动计没有随机性