59 | 性能设计:异步处理
陈皓
该思维导图由 AI 生成,仅供参考
你好,我是陈皓,网名左耳朵耗子。
在弹力设计篇中我们讲过,异步通讯的设计模式有助于提高系统的稳定性和容错能力。其实,异步通讯在分布式系统中还可以增加整个系统的吞吐量,从而可以面对更高的并发,并可以从容地利用好现有的系统资源。为什么这么说呢?
我们试想一下,在你的工作中,有很多人会来找你,让你帮着做事。如果你是这种请求响应式的工作方式,那么本质上来说,你是在被动工作,也就是被别人驱动的工作方式。
当你在做一件事的时候,如果有别人来找你做其它事,你就会被打断而要去干别的事。而如果你可以统筹安排这些事情,本来五件事只需要 2 个小时,如果不能,或者老被别人打乱思路,那你可能就要花 5 个小时。异步处理任务可以让你更好地利用好时间和资源。利用好了时间和资源,性能自然就会提升上来。
这就好像邮递业务一样,你寄东西的时候,邮递公司会把大量的去往同一个方向的订单合并处理,并统一地调配物流交通工具,从而在整体上更为节省资源和时间。
在分布式架构中,我们的系统被拆成了很多的子系统。如果想把这堆系统合理地用好,并更快地处理大量的任务,我们就需要统一地规划和统筹整体,这样可以达到整体的最优。本质上,这和邮递公司处理邮件一样,是相同的道理。
在计算机的世界里,到处都是异步处理。比如:当程序读写文件时,我们的操作系统并不会真正同步地去操作硬盘,而是把硬盘读写请求先在内存中 hold 上一小会儿(几十毫秒),然后,对这些读写请求做 merge 和 sort。
也就是说,merge 是把相同的操作合并,相同的读操作只读一次,相同的写操作,只写最后一次,而 sort 是把不同的操作排个序,这样可以让硬盘向一个方向转一次就可以把所有的数据读出来,而不是来来回回地转。这样可以极大地提高硬盘的吞吐率。
再如,我们的 TCP 协议向网络发包的时候,会把我们要发的数据先在缓冲区中进行囤积,当囤积到一定尺寸时(MTU),才向网络发送,这样可以最大化利用我们的网络带宽。而传输速度和性能也会变得很快。
这就是异步系统所带来的好处——让我们的系统可以统一调度。
另外,我举上面这两个例子是想告诉你,我们可能会觉得异步通讯慢,其实并不然,我们同样也可以把异步做得比较实时。
多说一句,就算是有延时,异步处理在用户体验上也可以给用户带来一个不错的用户体验,那就是用户可以有机会反悔之前的操作。
异步处理的设计
之前,我们在弹力设计中讲的是异步通讯,这里,我们想讲的是异步任务处理。当然,这里面没有什么冲突的,只不过是,异步通讯讲的是怎么把系统连接起来,而我们这里想讲的是怎么处理任务。
首先,我们需要一个前台系统,把用户发来的请求一一记录下来,有点像请求日志。这样,我们的操作在数据库或是存储上只会有追加的操作,性能会很高。我们收到请求后,给客户端返回“收到请求,正在处理中”。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
异步处理在分布式系统设计中扮演着重要角色,能够提高系统性能和资源利用率,适用于各种实际场景。本文通过比喻邮递业务,解释了异步处理如何统一调度系统,提高系统的吞吐率。文章介绍了异步任务处理的设计,包括推模型和拉模型的优缺点,以及事件溯源设计模式的应用,通过追加不可修改的数据操作事件,提高系统性能和可扩展性。此外,文章还探讨了异步处理的分布式事务,指出在现实生活中,并非所有场景都需要强一致性的事务,可以使用异步方式实现最终一致性。异步通讯不仅可以增加系统的稳定性和容错能力,还可以提高系统的吞吐量,从而更好地利用系统资源,面对更高的并发。异步处理系统的本质是把被动的任务处理变成主动的任务处理,其本质是在对任务进行调度和统筹管理。总的来说,异步处理在分布式系统设计中起到了重要作用,能够提高系统性能和资源利用率,适用于各种实际场景。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《左耳听风》,新⼈⾸单¥98
《左耳听风》,新⼈⾸单¥98
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(23)
- 最新
- 精选
- 颇忒妥Event sourcing 需要snapshot 否则启动时每次回放日志太恐怖。 如果要自制分布式系统可以看一下atomix项目
作者回复: 是的,要做snapshot
2018-05-1712 - K请教一下老师,用事务性的MQ来做最终一致性,这是一个好的实践吗?
作者回复: 可以的,但具体要看业务场景了
2018-05-153 - 浪荡居士耗子哥的文章没得说…引经据典…但有一点小建议,耗子哥能否把相关的开源框架也引用一下?我们小公司的小弟见识小…不知道哪些2018-05-15136
- Alan很失望2018-05-15226
- cf性能设计写几篇写的比较一般,都是面上哗啦哗啦,不够深入2020-01-0116
- 鱼Event Sourcing 与CQRS Event Sourcing原本只需追加记录Event,然后通过聚合操作得到聚合对象的最新状态。但是每一次重新(例如系统重启)获取聚合对象的最新状态太消耗资源,所以就需要把聚合对象的最新状态存在一张表中,即物化视图。这样我们Query操作直接读取视图数据即可,而Command操作(修改操作)沿用原来的事件驱动模式追加记录。所以CQRS是Event Sourcing很自然的一个结果。 通常,我们在追加触发事件操作时,使用一个EventHandler来更新视图(聚合对象的最新状态),还可以使用多个节点保存物化视图进一步提升读取性能。这也是最终一致性的一种实践吧。2020-05-0817
- 1angxi阿里面试的时候特别喜欢问这类问题🤣2018-06-0315
- edisonhuang异步处理的本质是把被动处理任务转换为主动处理,这样可以对任务做规划,统筹安排。异步处理 + 事件溯源的方式,可以让整体处理过程达到性能和资源的最大化利用。 这里就对应了两种模式push和pull,push做一定的调度,pull端订阅push提交的事件,主动处理任务。 异步处理可以保证事务的最终一致性,不能保证强一致性,但是大大提高了系统的性能和吞吐量2019-07-234
- 文刂 氵共 超坚持学习,学习笔记 https://mubu.com/colla/4M6zFJw6f902020-01-063
- 剑八异步处理还是很有用的 像一些非核心业务可以简单做成异步化 有些对业务成功要求最终一致性则还需要一系列的保障手段,如对账补偿等2018-11-182
收起评论