分布式金融架构课
任杰
eBay 支付账务系统负责人,前蚂蚁金服架构师
19876 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 30 讲
开篇词 (1讲)
分布式金融架构课
15
15
1.0x
00:00/00:00
登录|注册

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

你好,我是任杰。这节课我和你聊一聊怎么设计一个能正确处理数据的架构。
只把一件事情做正确很容易,难的是把所有的事情都做正确。当然了,绝对的完美是很难达到的,那退而求其次,我们有没有可能设计出一种架构来减少犯错误的可能性呢?或者再退一步,如果出现了错误,我们能不能准确地知道错误出在什么地方呢?
金融行业是有强监管要求的。金融系统不仅仅要求你正确地实现系统,而且还要求你能解释系统为什么是正确的。
所以这节课我会带你掌握事件溯源(Event Sourcing)的核心设计。这个架构是金融行业多年来沉淀下来的行之有效的正确性解决方案。你掌握了这个架构,金融行业正确性的问题也就基本解决了。

基本概念

游戏举例

不知道你有没有玩过联网的 5v5 即时对战手游。10 个人通过手机玩游戏,每个人都能看到其他人在游戏里的情况。虽然手机信号不太稳定,可能还会临时断网,但不管网络条件怎么恶劣,所有人手机里的游戏情况都是一样的。这就是多人游戏的正确性。
金融系统和游戏一样,对正确性都有很高的要求,这两个行业的架构也有类似之处。所以接下来我在介绍事件溯源设计的时候也会举一些游戏的例子,方便你理解。

关键术语

我们在第 4 节课第 5 节课介绍了领域驱动设计。事件溯源是领域驱动设计理论关于正确性的重要内容。在事件溯源里有三个重要的术语:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

事件溯源(Event Sourcing)是一种重要的架构设计思路,本文深入介绍了事件溯源的核心概念和实现方法。通过数学公式的解释,阐述了事件、状态和自动机之间的关系,以及事件溯源设计的正确性原理。文章重点讨论了命令、事件和状态的处理顺序,以及存储格式和执行过程。此外,还介绍了事件溯源设计中的CQRS术语,即读写分离,以及实时查询和历史查询的实现方法。总之,本文为读者提供了深入了解事件溯源设计核心概念和实现方法的重要参考资料。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《分布式金融架构课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(20)

  • 最新
  • 精选
  • LiuHu
    置顶
    想了解事件溯源的同学推荐阅读: https://docs.microsoft.com/en-us/previous-versions/msp-n-p/jj591559%28v=pandp.10%29?redirectedfrom=MSDN
    2021-04-16
  • Geek_2655db
    请问如何支持热点资源的事件溯源?比如金融账户的余额采用事件溯源的方式,当并发来的时候,如何在保证账户不透支的情况下,正确的记录事件并且给客户正确的响应?

    作者回复: 这位同学你好。热点事件的处理取决于系统实现方式。如果是用数据库或者Redis,就会出现常见的高负载情况下的常见问题,比如加锁会影响速度,不加锁会影响正确性。 在最基本的事件溯源架构下,系统是单线程运行,因此没有多线程/多进程访问的问题。另外状态也都在内存中,状态和计算可以同时恢复,永远一致。你可以想象为事件溯源是将计算逻辑放在了Redis内部。因此事件溯源在高负载环境下有一定的架构优势。

    2021-02-24
    1
  • 烟雨任平生
    如果运用领域驱动设计把业务划分出多个领域服务如账户、用户、交易等,那么为了实现整体业务事件溯源,通常是否需要运用事件溯源方法论来设计每个领域服务? 如果答案是否的话,那么选取事件溯源的设计逻辑是怎样的?

    作者回复: 这位同学你好。很不幸的是,在现实情况下很难做到整体架构的事件溯源。 事件溯源有两个假设,一个是所有命令之间存在线性关系,另一个是不具有随机性。但是复杂系统一般存在回路,这样消息之间就不再是线性关系。同时复杂系统一般会用到时钟,一旦业务跟时钟有关,那么很有可能具有随机性,因为时钟是不准确的。 所以,复杂系统不太可能实现整体的事件溯源。 简单的系统一般是线性的,这时候有可能将几个事件溯源的组件拼装成一个更大的事件溯源组件。 是否采用事件溯源设计取决于你觉得组件的正确性有多重要。如果一个组件重要到你需要了解它过去一步一步都发生了什么,那么就可以考虑。

    2021-01-16
    1
  • 燕羽阳
    转账的例子,单实例是否只能串行? 如果按userId分多实例,并且钱包有余额上线的限制。比如200元。 命令: A转账给B一元(A、B账户分别存储在节点1和节点2),在节点1执行,如何同时检测A和B的状态(余额),及执行事件 ,才能防止B账户余额超过200元?

    作者回复: 燕羽阳你好。我会在后面第13节课详细讲解怎么在多个实例的情况下解决正确性的问题。

    2021-01-19
  • webmin
    1. 每一个事件和事件索引,通过Hash算法生成定长验证串,保存在每个事件Head信息中; 2. 先写事件数据文件,再写事件索引文件,这样查询不会因为索引到检索到,而不到读到事件数据的问题。

    编辑回复: webmin同学,给你的学习热情点赞。07的思考题参考答案,你可以在答疑集锦(二)找到,希望对你有启发!

    2021-01-17
  • tt
    命令的结果是生成事件,那事件也会触发新的事件,特别是当多个事件满足一定条件才会产生新的事件,该怎么处理呢? 比说双时序数据库,事件虽然客观上发生了,比如通货膨胀率是客观的,但是发生的当下人们并不知道具体的数值,只能进行估计,那估计的结果必然有一个随机变量,这不就引入随机性了么?

    作者回复: tt你好。事件不会触发事件,而是触发命令。命令会再生成新的事件。命令可以有随机性,但是事件的执行一定不能有随机性。

    2021-01-08
  • 趁早
    事务,先索引再事件

    编辑回复: 给你的学习热情点赞。这节课思考题的答案,你可以在答疑集锦(二)找到,希望对你有启发!

    2021-01-06
  • tt
    1、如何检测文件的完整性? 可以借鉴MYSQL的做法,在文件结构上想办法,就是在完成对文件的刷盘时,在文件中写一个标记: 对于redolog来说,就是有commit标识; 对于statement 格式的 binlog,最后会有 COMMIT;row 格式的 binlog,最后会有一个 XID event。而且还引入了 binlog-checksum 参数,用来验证 binlog 内容的正确性。 2、存储事件和存储事件的索引的存储顺序是怎样的? 应该是存储事件吧,只有事件真正的持久化以后,它的位置才会确定,也就是此时才可以被索引指向。或者说存储事件的过程是为了写,索引是为了读取,他们本身就构成一个线性一致性,起码是因果上的一致性。
    2021-01-08
    5
  • 华仔
    感觉这个思路和会计记账的思路是一样的
    2021-01-22
    4
  • 之渊
    明白很多关于事件溯源,这就是银行用事件溯源解决分布式事务问题了
    2021-08-05
    2
收起评论
大纲
固定大纲
基本概念
游戏举例
关键术语
显示
设置
留言
20
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部