高并发系统设计40问
唐扬
美图公司技术专家
立即订阅
9202 人已学习
课程目录
已更新 38 讲 / 共 40 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 为什么你要学习高并发系统设计?
免费
基础篇 (6讲)
01 | 高并发系统:它的通用设计方法是什么?
02 | 架构分层:我们为什么一定要这么做?
免费
03 | 系统设计目标(一):如何提升系统性能?
04 | 系统设计目标(二):系统怎样做到高可用?
05 | 系统设计目标(三):如何让系统易于扩展?
06 | 面试现场第一期:当问到组件实现原理时,面试官是在刁难你吗?
演进篇 · 数据库篇 (5讲)
07 | 池化技术:如何减少频繁创建数据库连接的性能损耗?
08 | 数据库优化方案(一):查询请求增加时,如何做主从分离?
09 | 数据库优化方案(二):写入数据量增加时,如何实现分库分表?
10 | 发号器:如何保证分库分表后ID的全局唯一性?
11 | NoSQL:在高并发场景下,数据库和NoSQL如何做到互补?
演进篇 · 缓存篇 (6讲)
12 | 缓存:数据库成为瓶颈后,动态数据的查询要如何加速?
13 | 缓存的使用姿势(一):如何选择缓存的读写策略?
14 | 缓存的使用姿势(二):缓存如何做到高可用?
15 | 缓存的使用姿势(三):缓存穿透了怎么办?
16 | CDN:静态资源如何加速?
加餐 | 数据的迁移应该如何做?
演进篇 · 消息队列篇 (6讲)
17 | 消息队列:秒杀时如何处理每秒上万次的下单请求?
18 | 消息投递:如何保证消息仅仅被消费一次?
19 | 消息队列:如何降低消息队列系统中消息的延迟?
20 | 面试现场第二期:当问到项目经历时,面试官究竟想要了解什么?
用户故事 | 从“心”出发,我还有无数个可能
期中测试 | 10道高并发系统设计题目自测
演进篇 · 分布式服务篇 (9讲)
21 | 系统架构:每秒1万次请求的系统要做服务化拆分吗?
22 | 微服务架构:微服务化后,系统架构要如何改造?
23 | RPC框架:10万QPS下如何实现毫秒级的服务调用?
24 | 注册中心:分布式系统如何寻址?
25 | 分布式Trace:横跨几十个分布式组件的慢请求要如何排查?
26 | 负载均衡:怎样提升系统的横向扩展能力?
27 | API网关:系统的门面要如何做呢?
28 | 多机房部署:跨地域的分布式系统如何做?
29 | Service Mesh:如何屏蔽服务化系统的服务治理细节?
演进篇 · 维护篇 (5讲)
30 | 给系统加上眼睛:服务端监控要怎么做?
31 | 应用性能管理:用户的使用体验应该如何监控?
32 | 压力测试:怎样设计全链路压力测试平台?
33 | 配置管理:成千上万的配置项要如何管理?
34 | 降级熔断:如何屏蔽非核心系统故障的影响?
高并发系统设计40问
登录|注册

03 | 系统设计目标(一):如何提升系统性能?

唐扬 2019-09-23
提到互联网系统设计,你可能听到最多的词儿就是“三高”,也就是“高并发”“高性能”“高可用”,它们是互联网系统架构设计永恒的主题。在前两节课中,我带你了解了高并发系统设计的含义,意义以及分层设计原则,接下来,我想带你整体了解一下高并发系统设计的目标,然后在此基础上,进入我们今天的话题:如何提升系统的性能?

高并发系统设计的三大目标:高性能、高可用、可扩展

高并发,是指运用设计手段让系统能够处理更多的用户并发请求,也就是承担更大的流量。它是一切架构设计的背景和前提,脱离了它去谈性能和可用性是没有意义的。很显然嘛,你在每秒一次请求和每秒一万次请求,两种不同的场景下,分别做到毫秒级响应时间和五个九(99.999%)的可用性,无论是设计难度还是方案的复杂度,都不是一个级别的。
而性能和可用性,是我们实现高并发系统设计必须考虑的因素。
性能反应了系统的使用体验,想象一下,同样承担每秒一万次请求的两个系统,一个响应时间是毫秒级,一个响应时间在秒级别,它们带给用户的体验肯定是不同的。
可用性则表示系统可以正常服务用户的时间。我们再类比一下,还是两个承担每秒一万次的系统,一个可以做到全年不停机、无故障,一个隔三差五宕机维护,如果你是用户,你会选择使用哪一个系统呢?答案不言而喻。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《高并发系统设计40问》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(35)

  • 肖大保健
    讲的太宽泛了,请具体实例化,这种文章在网上到处能找到,建议多点干货

    编辑回复: 基础篇会偏理论知识多一些,主要是想给大家一些高并发知识的概要介绍,这部分案例偏少,我们在做课程设计的时候考虑到了,从我的角度,这部分内容是必讲的,并且我敢说这种讲法你在外面是找不到的,都是我的经验总结。

    案例我们会从演进篇开始加入,思路是从一个简易系统到一个复杂系统的高并发演进之路。我很想把这个内容做好,所以类似的反馈还请大家都提给我,我和极客时间团队讨论后会根据情况做优化。

    之所以把这个留言放出来也是这样,希望能得到大家的监督,我们一起学好高并发知识。分享就是学习,从和大家的交流离我也在成长。

    2019-09-23
    5
    104
  • Jxin
    1.业务价值->承载高并发->性能优化。一切的前提是业务价值需要。如果没有足够的价值,那么可读性才是第一,性能在需要的地方是no.1,但不需要的地方可能就是倒数第一稞。当下技术框架出来的软件差不到哪去,没有这种及时响应诉求的地方,削峰下慢慢跑就是了。(工作需要,常在缺少价值的地方着手性能优化,让我对这种就为个数字的操作很反感。要知道,异步,并发编程,逻辑缓存,算法真的会加剧系统的复杂度,得不偿失。如果没那个价值,简单才是王道)

    2.提高并发度。要么加硬件,要么降低服务响应时间。做为开发,我们的目光更聚焦在降低响应时间这块。
    1.采用非阻塞的rpc调用(高效的远端请求模式,采用容器的覆盖网络我认为也算)
    2.将计算密集和io密集的的逻辑分割开,单独线程池,调整线程比例压榨单机性能(或者说找拐点)。
    3.做缓存,io耗时的缓存和计算耗时的缓存(多级缓存,数据压缩降低带宽)。
    4.采用享元模式,用好对象池和本地线程空间,尽量减少对象创建与销毁的开销,提高复用。
    5.业务拆分,像状态变化后的外部系统通知,业务监控,es或solr等副本数据同步等操作,无需在主流程中做的事都拆掉。走canal监听表数据变化,推mq保最终一致的方式从业务项目完全解偶出来。
    6.fork_join,分而治之的处理大任务。并发编程,采用多线程并行的方式处理业务。(规避伪共享,减小锁力度,采用合适的锁)。
    7.数据库配置优化,查询优化。(存储优化比较头疼,毕竟不按业务拆单点跑不掉,单点性能就要命。基本只能内存库先行,后台同步数据做持久。然后内存库多副本,自修复,保留一系列自修复失败的修复手段)

    作者回复: 给你点赞👍

    2019-09-24
    2
    35
  • Cola_
    高并发:高性能(响应时间)、高可用(down机、故障、维护)、可扩展(应急扩容)
    响应时间(平均值、最大值、分位值),响应为1s,吞吐量为每秒1次,响应缩短到10ms,吞吐量上升到每秒100次,从用户体验来说:200ms分界点,1s为另一个分界点,健康系统的99分位值的响应时间控制在200ms以内,不超过1s的请求占比要超过99.99%
    高并发下的性能优化手段:
    1.提高系统的处理核心数(吞吐量=核心数(并发进程数)/响应时间(s))
      但并非无限增加核心数就可以增加吞吐量,随着进程数增加,并行的任务对于资源的争夺也增加,在某
      个临界点,进程增加导致系统的性能下降,这就是性能测试中的拐点模型,所以在评估系统性能时,需要做压力测试,找到拐点
    2.减少单次任务响应时间
    cpu密集型:优化算法
    io密集型:1.采用工具,linux的工具集
                  2.通过监控,对任务的每一个步骤做分时统计,从而找到任务中哪一步小号消耗了更多的时间


    作者回复: 👍👍

    2019-09-23
    1
    12
  • 平步青云
    既然老师愿意把这门课做好,作为学员提几点建议:
    1.每一章都会有一个中心,几个侧重点,建议关键部分文字加粗或者字号加大一点,让重心更醒目。一遍看下来,几乎啥都没记住。
    2.条理清晰,有时候你会发现,用1.2.3这种编号作用非常明显。这点得到做的挺好的,我都购买的有课程。
    3.技术文章,理论讲太多,都觉得是鸡汤,看了就忘,或者说作用不大,理论大家能查阅资料,也算是理解一星半点。大家的问题都在于没把理论作用于实践中,如果每一章讲完理论后能够以实际应用辅助讲一下,可以说事半功倍。
    4.我说话很直接,真正的高手也不会购买课程,购买课程的也是大家在这块有短板,希望通过这门课解决一些项目中的问题。按照2/8原则,百分之八十的人项目中都没有大并发,这种系统设计和运用,大家缺乏经验。讲解时候,浅显易懂,案例分享很关键,百分之八十人看懂了,能应用了,那这门课非常成功了。
    5.希望高手之间多讨论或者辩论,其实在你们的讨论中,可以学到很多,开拓视野,举一反三。希望评论中只要不是骂人,违反国家政策,涉及到问题本身讨论的,尽量显示出来。

    作者回复: 好的 后面演进篇中会有案例

    2019-09-24
    10
  • 无形
    之前做广告检索遇到的问题,倒排索引存在Redis,每次都要请求Redis,但是并发时,Redis连接数太大,甚至打开文件数过大,后采用Redis连接池,Redis连接数得到控制,而且响应更快,后来随着并发数的增大,连接池资源耗尽,而且Redis也有并发限制,数据传输导致大量占用带宽,响应时间更久,因此,又使用了本地缓存,每次请求先请求本地缓存,找不到再请求Redis,缓存到本地,缓存更新时通过消息队列来通知程序更新本地缓存,这样节省了大量的和Redis之间的请求耗时和带宽占用,性能有了数倍的提升。后面还有很多优化,性能优化不是一蹴而就的,每个阶段面对的场景是不一样的,需要找到每个瓶颈点针对性的优化

    作者回复: 赞,经验丰富老司机:)

    2019-10-31
    4
  • 星星
    老师你好,高并发 有什么好的模拟工具?

    作者回复: 一般使用线上流量引流的工具,tcpcopy, goreplay

    2019-09-25
    3
  • 高源
    从小到大从浅入深,老师我最想知道的是开发的系统如何找出程序瓶颈,问题具体出现在哪,用什么工具或者方法解决了,从而在后期有机会设计高并发高可用系统的时候根据实际情况来下手

    作者回复: 找问题的话主要有三个方法,监控,工具和压测

    压测和监控后面会有介绍,工具要依靠自己的积累,在文章中也有介绍

    2019-09-24
    1
    3
  • 饭团
    嗯,老师说的数据优先,我觉得最重要!一切的优化前提都是在数据的支撑下进行!请问老师一般系统的性能指标都问怎么统计?
    比如最大响应时间,平均响应时间!分位值统计方式,我们可以在请求开始和请求返回时做时间统计!写入log之后定时分析log得到!
    系统cpu指标,内存指标,io指标这种是定时通过系统函数获取信息统计吗?
    其实我想问老师的是,一般高并发系统都统计系统的哪些指标?

    作者回复: 这个在后面课程会有介绍哦:)

    2019-09-23
    2
    3
  • Geek_Rex
    请问通过什么工具可以测试WEBAPI的响应时间?

    作者回复: access log有记录响应时间的,可以收集起来做成监控

    2019-09-24
    2
  • M
    老师问一下,目前做线上压测有什么工具吗,或者通常用什么方法来做呢?

    作者回复: 压测在32节中讲到

    2019-11-20
    1
    1
  • 虫子
    老师,一个系统支持的并发数峰值通常如何估算?如果通过nginx增加负载均衡后,提升多少,又如何估算?

    作者回复: 这个不太好这么估算,要依据你的业务的复杂度。比如你业务比较重,那么单机支持的并发肯定就少。

    所以好的办法是通过线上压测来评估

    2019-10-16
    1
  • longslee
    思考时间:老师我们目前还是传统项目,所以瓶颈大部分在数据库上(即使是分布式,通过对调用链监控,发现对单体方法也以SQL问题居多),基本上解决了top SQL就能好一大半,而top SQL又大多是表关联之间和索引的优化;也有特例,咱们选用Java,对JVM监控也能看出一些问题,比如锁争用太高限制线程数增加的吞吐量增加。最后,咱还可以从业务着手,通过数学推演,减少不必要的环节。

    作者回复: 👍👍👍

    2019-10-03
    1
  • 此方彼方Francis
    支持一下老师,个人觉得,做事情,知道怎么做是一回事儿,知道这么做背后的指导思想又是另外一回事。

    作者回复: 是的,没错,重要的是了解背后的原理

    2019-09-30
    1
  • sun
    日常工作中,项目优化的不够好,那就对部门进行优化⁽⁽ଘ😇ଓ⁾⁾

    作者回复: 这。。

    2019-09-26
    1
  • Luciano李鑫
    “我们通常使用吞吐量或者同时在线用户数来度量并发和流量,使用吞吐量的情况会更多一些。但是你要知道,这两个指标是呈倒数关系”
    这个地方是不是有问题,吞吐量和在线用户数是倒数关系??

    作者回复: 表述不清楚,应该是吞吐量和响应时间

    2019-09-25
    1
  • 大雄
    提高系统核数就从硬件角度出发,应该可以包含两方面:一是单纯地将单台服务器由1核变为多核,垂直扩展;也可以是部署负载均衡集群,进行水平扩展。

    作者回复: 多核技术对于cpu核心来说也可以认为是水平扩展

    2019-09-24
    1
  • 吃饭饭

    老师能普及一下常见的术语吗?比如 QPS 和 TPS。日常优化不从服务器谈,只说 Review 的一些常识,避免循环调用,热点数据提前预热,可以加入利用内存缓存一些配置数据等等,不知道理解的对不对:)

    作者回复: QPS指的是每秒查询请求数;TPS指的是每秒执行事务数,偏向于写请求。
    这些常识虽然有些零散,不过是正确的:)

    2019-09-23
    1
  • Maxwell
    老师,在高并发时涉及到要更改公用的值,考虑到数据库的并发量的瓶颈,采用缓存来抗并发,但此时数据一致性的保证一般什么方案?

    作者回复: 可以考虑cache aside的方式来使用缓存,后面会介绍:)

    2019-09-23
    1
  • woshicai
    coroutine替代thread ;
    优点:优化内存
    缺点:增加代码复杂性
    2019-11-24
  • 布小丫学编程
    性能优化手段:
    1.横向扩展。如服务应用采用分布式设计,方便后期横向扩展;数据库使用分库分表;缓存使用集群部署;MQ使用集群等等。
    2.应用增加缓存,减少数据库的IO查询。
    3.数据库优化,比如加索引,索引优化。
    2019-11-15
收起评论
35
返回
顶部