左耳听风
陈皓
网名“左耳朵耗子”,资深技术专家
180930 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 119 讲
左耳听风
15
15
1.0x
00:00/00:00
登录|注册

59 | 性能设计:异步处理

可启用补偿操作
提供事务数据一致性
提高性能和响应时间
简化系统
减少复杂度
调度任务
快速扩容和限流
监控任务队列积压
强一致性 vs 最终一致性
业务事务回滚
定时任务处理超时任务
任务处理状态回传
补偿事务
幂等性处理
交易凭证
最终一致性
Event Sourcing
Pull模型
Push模型
提高系统稳定性和容错能力
异步处理的设计要点
分布式事务
事件溯源
推拉结合的模型
异步通讯
性能设计篇
弹力设计篇
异步处理

该思维导图由 AI 生成,仅供参考

你好,我是陈皓,网名左耳朵耗子。
在弹力设计篇中我们讲过,异步通讯的设计模式有助于提高系统的稳定性和容错能力。其实,异步通讯在分布式系统中还可以增加整个系统的吞吐量,从而可以面对更高的并发,并可以从容地利用好现有的系统资源。为什么这么说呢?
我们试想一下,在你的工作中,有很多人会来找你,让你帮着做事。如果你是这种请求响应式的工作方式,那么本质上来说,你是在被动工作,也就是被别人驱动的工作方式。
当你在做一件事的时候,如果有别人来找你做其它事,你就会被打断而要去干别的事。而如果你可以统筹安排这些事情,本来五件事只需要 2 个小时,如果不能,或者老被别人打乱思路,那你可能就要花 5 个小时。异步处理任务可以让你更好地利用好时间和资源。利用好了时间和资源,性能自然就会提升上来。
这就好像邮递业务一样,你寄东西的时候,邮递公司会把大量的去往同一个方向的订单合并处理,并统一地调配物流交通工具,从而在整体上更为节省资源和时间。
在分布式架构中,我们的系统被拆成了很多的子系统。如果想把这堆系统合理地用好,并更快地处理大量的任务,我们就需要统一地规划和统筹整体,这样可以达到整体的最优。本质上,这和邮递公司处理邮件一样,是相同的道理。
在计算机的世界里,到处都是异步处理。比如:当程序读写文件时,我们的操作系统并不会真正同步地去操作硬盘,而是把硬盘读写请求先在内存中 hold 上一小会儿(几十毫秒),然后,对这些读写请求做 merge 和 sort。
也就是说,merge 是把相同的操作合并,相同的读操作只读一次,相同的写操作,只写最后一次,而 sort 是把不同的操作排个序,这样可以让硬盘向一个方向转一次就可以把所有的数据读出来,而不是来来回回地转。这样可以极大地提高硬盘的吞吐率。
再如,我们的 TCP 协议向网络发包的时候,会把我们要发的数据先在缓冲区中进行囤积,当囤积到一定尺寸时(MTU),才向网络发送,这样可以最大化利用我们的网络带宽。而传输速度和性能也会变得很快。
这就是异步系统所带来的好处——让我们的系统可以统一调度。
另外,我举上面这两个例子是想告诉你,我们可能会觉得异步通讯慢,其实并不然,我们同样也可以把异步做得比较实时。
多说一句,就算是有延时,异步处理在用户体验上也可以给用户带来一个不错的用户体验,那就是用户可以有机会反悔之前的操作。

异步处理的设计

之前,我们在弹力设计中讲的是异步通讯,这里,我们想讲的是异步任务处理。当然,这里面没有什么冲突的,只不过是,异步通讯讲的是怎么把系统连接起来,而我们这里想讲的是怎么处理任务。
首先,我们需要一个前台系统,把用户发来的请求一一记录下来,有点像请求日志。这样,我们的操作在数据库或是存储上只会有追加的操作,性能会很高。我们收到请求后,给客户端返回“收到请求,正在处理中”。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

异步处理在分布式系统设计中扮演着重要角色,能够提高系统性能和资源利用率,适用于各种实际场景。本文通过比喻邮递业务,解释了异步处理如何统一调度系统,提高系统的吞吐率。文章介绍了异步任务处理的设计,包括推模型和拉模型的优缺点,以及事件溯源设计模式的应用,通过追加不可修改的数据操作事件,提高系统性能和可扩展性。此外,文章还探讨了异步处理的分布式事务,指出在现实生活中,并非所有场景都需要强一致性的事务,可以使用异步方式实现最终一致性。异步通讯不仅可以增加系统的稳定性和容错能力,还可以提高系统的吞吐量,从而更好地利用系统资源,面对更高的并发。异步处理系统的本质是把被动的任务处理变成主动的任务处理,其本质是在对任务进行调度和统筹管理。总的来说,异步处理在分布式系统设计中起到了重要作用,能够提高系统性能和资源利用率,适用于各种实际场景。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《左耳听风》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(23)

  • 最新
  • 精选
  • 颇忒妥
    Event sourcing 需要snapshot 否则启动时每次回放日志太恐怖。 如果要自制分布式系统可以看一下atomix项目

    作者回复: 是的,要做snapshot

    2018-05-17
    12
  • K
    请教一下老师,用事务性的MQ来做最终一致性,这是一个好的实践吗?

    作者回复: 可以的,但具体要看业务场景了

    2018-05-15
    3
  • 浪荡居士
    耗子哥的文章没得说…引经据典…但有一点小建议,耗子哥能否把相关的开源框架也引用一下?我们小公司的小弟见识小…不知道哪些
    2018-05-15
    1
    36
  • Alan
    很失望
    2018-05-15
    2
    26
  • cf
    性能设计写几篇写的比较一般,都是面上哗啦哗啦,不够深入
    2020-01-01
    16
  • Event Sourcing 与CQRS Event Sourcing原本只需追加记录Event,然后通过聚合操作得到聚合对象的最新状态。但是每一次重新(例如系统重启)获取聚合对象的最新状态太消耗资源,所以就需要把聚合对象的最新状态存在一张表中,即物化视图。这样我们Query操作直接读取视图数据即可,而Command操作(修改操作)沿用原来的事件驱动模式追加记录。所以CQRS是Event Sourcing很自然的一个结果。 通常,我们在追加触发事件操作时,使用一个EventHandler来更新视图(聚合对象的最新状态),还可以使用多个节点保存物化视图进一步提升读取性能。这也是最终一致性的一种实践吧。
    2020-05-08
    1
    7
  • 1angxi
    阿里面试的时候特别喜欢问这类问题🤣
    2018-06-03
    1
    5
  • edisonhuang
    异步处理的本质是把被动处理任务转换为主动处理,这样可以对任务做规划,统筹安排。异步处理 + 事件溯源的方式,可以让整体处理过程达到性能和资源的最大化利用。 这里就对应了两种模式push和pull,push做一定的调度,pull端订阅push提交的事件,主动处理任务。 异步处理可以保证事务的最终一致性,不能保证强一致性,但是大大提高了系统的性能和吞吐量
    2019-07-23
    4
  • 文刂 氵共 超
    坚持学习,学习笔记 https://mubu.com/colla/4M6zFJw6f90
    2020-01-06
    3
  • 剑八
    异步处理还是很有用的 像一些非核心业务可以简单做成异步化 有些对业务成功要求最终一致性则还需要一系列的保障手段,如对账补偿等
    2018-11-18
    2
收起评论
显示
设置
留言
23
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部