高并发系统设计 40 问
唐扬
美图公司技术专家
49013 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
高并发系统设计 40 问
15
15
1.0x
00:00/00:00
登录|注册

01 | 高并发系统:它的通用设计方法是什么?

一课一思
课程小结
系统设计演进
异步处理
缓存
Scale-out
高并发系统设计方法

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

我们知道,高并发代表着大流量,高并发系统设计的魅力就在于我们能够凭借自己的聪明才智设计巧妙的方案,从而抵抗巨大流量的冲击,带给用户更好的使用体验。这些方案好似能操纵流量,让流量更加平稳地被系统中的服务和组件处理。
来做个简单的比喻吧。
从古至今,长江和黄河流域水患不断,远古时期大禹曾拓宽河道,清除淤沙让流水更加顺畅;都江堰作为史上最成功的治水案例之一,用引流将岷江之水分流到多个支流中,以分担水流压力;三门峡和葛洲坝通过建造水库将水引入水库先存储起来,然后再想办法把水库中的水缓缓地排出去,以此提高下游的抗洪能力。
而我们在应对高并发大流量时也会采用类似“抵御洪水”的方案,归纳起来共有三种方法。
Scale-out(横向扩展):分而治之是一种常见的高并发系统设计方法,采用分布式部署的方式把流量分流开,让每个服务器都承担一部分并发和流量。
缓存:使用缓存来提高系统的性能,就好比用“拓宽河道”的方式抵抗高并发大流量的冲击。
异步:在某些场景下,未处理完成之前我们可以让请求先返回,在数据准备好之后再通知请求方,这样可以在单位时间内处理更多的请求。
简单介绍了这三种方法之后,我再详细地带你了解一下,这样当你在设计高并发系统时就可以有考虑的方向了。当然了,这三种方法会细化出更多的内容,我会在后面的课程中深入讲解。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

高并发系统设计方法总结 本文介绍了高并发系统设计的三种通用方法:Scale-out(横向扩展)、缓存和异步处理。Scale-out通过分布式部署将流量分流开,缓存利用内存存储提升系统性能,而异步处理则允许请求先返回,待数据准备好后再通知请求方,从而提高单位时间内的请求处理量。文章重点讨论了Scale-up和Scale-out的区别,指出在系统设计初期通常会考虑使用Scale-up,但当系统并发超过了单机的极限时,就需要使用Scale-out。另一方面,文章强调了缓存在系统设计中的重要性,指出利用内存作为存储介质的缓存可以大幅度提升系统性能。总的来说,高并发系统设计需要综合考虑多种方法,根据系统的实际情况选择合适的设计方案,同时需要注意各种设计方法可能引入的复杂问题,如节点故障、状态同步和节点的动态增删等。文章还强调了高并发系统的演进应该是循序渐进,以解决系统中存在的问题为目的和驱动力的。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《高并发系统设计 40 问》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(107)

  • 最新
  • 精选
  • 老男孩
    martin fowler好像曾经说过,能使用单体解决的问题,就不要采用分布式。不能为了技术而技术,采用分布式固然可以分流用户请求,提高系统的响应能力,但同样也带来了复杂性。软件开发最终的目的是商业利益。非常赞成老师的观点,罗马城不是一天就建立起来的。架构的工作应该是阶段性,解决阶段性系统的复杂性。如果单体跑的很好,或者通过scale up方式在成本可控的情况能解决就不要想着诗和远方,因为系统内部的进程间调用,肯定比不同物理机的进程之间调用要快。

    作者回复: 说的真好!

    2019-09-18
    5
    164
  • Luciano李鑫
    代部落伙伴问个问题:关于秒杀这种场景我想的是用redis的list不就完全可以实现吗。活动开始前,先把要抢的N个商品push到list中。活动开始后,每来一个请求就从list中pop一个商品出去,当list为空后直接返回“已抢光”的响应,由于可秒杀的商品数量并不多,能通过的请求也可以采用同步的方式进行,这样不是既简单又快速。可是我搜了一下网上的方案,都特别的复杂,请问这种方式有什么问题吗?

    作者回复: 这个商品应该是放在单一的redis节点里面的吧,放在多个节点里面不好维护一致性。那么如果在流量或者带宽方面超过单个节点的限制咋办?是否要考虑动态和静态数据的隔离?是否要考虑降低redis的写流量峰值?所以流量大了,自然方案就复杂了~

    2019-09-19
    21
    43
  • 1.技术在不断演进,演进的目的和内驱动力是解决当前系统存在的问题,过早过度设计大多只会延误系统的发展。一切都以实际情况和需要出发,一步步优化,一步步演进,个人能力提升也是同样的道理。 2.高并发系统设计通用方法:水平拓展,缓存,异步。这只是指导思想,如何更巧妙的运用才是最具魅力的。

    作者回复: 说的真好!

    2019-09-18
    18
  • 三年过后
    老师讲得很好!不过,还是觉得偏理论较多。例如,讲到踩过很多坑,这些坑没有一些案例说明和后来的解决问题方案。比如,之前负责的支付系统项目,在流量不是很大的情况下,就引入了zk集群(3台)zk集群所在的线上服务,存在一台宕机,整个线上支付都不可用。后面解决:只好切回单体服务

    作者回复: 后面课程会有一些关键知识点的案例介绍的

    2019-09-18
    9
    12
  • 马留
    老师,你把“缓存”比喻成“拓宽河道”,个人觉得是不妥当的,应是建水库更好些。拓宽河道比较类似Scale-out

    作者回复: scale-out可以理解为引流和分流;缓存的作用是提速,拓宽河道的作用也是提速,所以有一些的关联

    2019-09-18
    5
    11
  • yuan
    老师,消息队列用到缓存,之前没有听说过这个,请问哪种消息队列用到缓存?

    作者回复: 内部实现会用到缓存的思想,Kafka会用到pagecache

    2019-09-24
    2
    8
  • 鞠小军
    总结:高并发设计三种思路 1、横向扩展 2、缓存 3、异步 首先,不能为了设计而设计,不要过度设计。单机满足业务需求就不要分布式,架构不能盲目,架构一定是逐步演进的,而且是随着业务的需求逐步进行的。 三种思路理解要宽泛。比如横向扩展可以是集群,可以是主从分离,也可以是分库分表等等。 缓存呢其实无处不在,比如CPU的一级缓存、二级缓存、三级缓存,操作系统缓存(如windows的page.sys文件),mybatis的一级缓存,二级缓存等等。 异步就是解藕操作,比如将订单成交的消息我需要保证准确性而不是实时性,因此就先放入消息队列中,消息被消费的时候在进行业务的处理,这样就可以提高并发请数量

    作者回复: 👍

    2019-11-07
    2
    6
  • MYG
    讲得真好!小建议,对于一些关键的术语可不可以像我们讲scale-out一样,同时使用中文和英文呢?比如cache,async,这样可以方便将来同时查阅中英文文献。

    作者回复: 好嘞,以后我会注意的:)

    2019-09-19
    6
  • 老师,多级缓存中,redis层的好处理,但是Nginx缓存,tomcat本地缓存,都是多台机器分布式部署,该如何及时主动更新

    作者回复: 比如说如果要更新缓存就向一个消息队列里发一个消息,tomcat消费消息后清除本地缓存。不过更多的是等待缓存自己过期,或者定期更新缓存

    2019-09-27
    5
  • 由莫
    把缓存比喻成拓宽河道不合理。从另外的角度来看,拓宽河道就是增加流量的带宽。这跟缓存放在一起说感觉让人对缓存有误解。

    作者回复: 当时考虑的是拓宽河道是让水流更快,和缓存思想比较接近

    2019-09-18
    4
    4
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部