备注说明:相关总结属于个人学习笔记,请勿商用,感兴趣的可在极客时间订阅该《乔新亮的CTO成长复盘》专栏学习,谢谢~
产品思维有两个核心关键词:“契约精神”和“洞察人性”, 高性能设计,一切围绕着契约精神
高性能是与业务强相关
一台网络游戏服务器来说,可以支撑 400 名玩家同时在线,就算高性能
一台流媒体服务器来说,可以支撑 1w用户同时在线观看,就算高性能
高性能设计两大步骤:
- 清晰描述、定义性能目标
- 设计并实现这个目标
目标 定义三类指标
- 系统响应时间:服务 / 交易处理的时间,也包括网络响应时间
- 系统吞吐量:系统的每秒交易量,通常需要结合并发量共同描述
- 系统容量:系统的可用资源数量,包括硬盘容量、网络带宽等
三类指标不能孤立地看待
-在定义系统响应时间目标时,如果不与系统吞吐量关联起来,一旦流量的压力高峰到来就会有问题
要学会识别架构设计中的组件(或服务),首先弄清哪些组件需要明确高性能指标,再针对性地用以上三个指标做清晰定义。
系统响应时间,直观的监控指标叫做Top 百分数 (Top Percentile),简称 TP。
比如, TP 90 = 2s,意思是,90% 的请求的响应时间都在 2s 内;
有了 TP 90 = 2s这个契约,还要再问一句
在什么场景下。本系统、组件、服务承诺在任何情况、任何资源、任何压力高峰下,都保证 TP 90 = 2s 。
有上限的“契约”才能交付
关注边界 如:“该架构最高支持 200 万并发流量,TP 90 = 2s 。”,这里忽略了 200万之后的用户清情况,定义还是不够清晰
分步骤考虑
- 当服务器不超过 200 万并发用户时,TP 90 = 2s 。
- 当连接服务器的并发用户数量超过 200 万,达到 250 万时,保证有 200 万用户的 TP 90 = 2s ,拒绝其他用户的连接请求。
- 为设计容量外的用户提供服务器排队机制,并附带具体、明确的系统提示。
- 3 分钟内完成扩容,保证并发用户数量小于等于 250 万时,任何在线用户的 TP 90 = 2s。
高性能设计,一定要明确具体清晰目标,并交付给用户
3个关键技术点
- 为架构做好“保护系统”;
- 使架构具备扩容能力;
- 提升系统各组件处理能力。
保护系统
是为应对容量规划外的过载而设计的,通过流量控制来具体实现。 所谓流量控制,就是当实际并发压力,超过设计性能的时候,人为阻断服务器连接,告知用户需要排队或“稍后再试”。
流量控制有两种实践:
1面向连接数做控制:让用户在不断尝试连接时,有一定成功的可能
2面向用户数做控制:则保证用户对系统的期望是一致的 —— 要么可以登录、要么不能登录。具体应该选择哪种方式,取决于业务的实际诉求
扩容能力
一般要包括储备额外的计算资源和具备快速弹性扩容能力。
不能所有系统都设计扩容。有针对性。
扩容速度要快:“天下武功,唯快不破”
理想的状态:到了双十一,用户数量快速增长,很快突破了 200 万,流量控制机制开始生效,新用户进入排队序列。
你考虑了 3 秒钟,做了决定:系统需要扩容。输入一个数字,3 秒钟后,排队序列消失了
各组件处理能力的提升内容:(性能设计一定要尽早开始)
- 需求早期收集
- 容量分析
- 估算与建模
- 技术研究
- 设计、开发、跟踪
- 测试计划执行
- 风险与绩效管理
对系统资源的争抢问题
当响应时间随着并发压力的增大而变长时,一般都意味着这些请求引起了对系统资源的争抢。
解决方案:
对于无状态的服务,理论上可以通过集群扩容,无限增加系统的并发处理能力,简单、直接地解决问题;
但对于有状态的数据服务而言,比如缓存或数据访问,就要考虑资源争抢问题,并针对性地设计、处理。
解决方案:隔离
高性能架构在设计落地时,一个重要的任务是:发现那些可能出现资源争抢的模块,并一一进行隔离。
一种是在应用层进行隔离,也就是说,在业务功能层面就开始隔离;
一种是基础软件层面进行隔离,比如与数据库相关的“读写分离”概念,就是在基础软件层面进行隔离。
三种主要的“隔离”技巧
- 缓存机制,适用于部分场景,可以解决数据库资源的争抢问题
- EDA 架构,适用于处理时间较长的代码逻辑,需要提前区分哪些模块可以做同步处理,哪些模块可以做异步处理
- 提前进行预处理,以空间换时间,这也是一种卓有成效的处理手段。
EDA 架构(Event-Driven Architecture,事件驱动架构)是一种软件架构范式,它通过事件(Event)来驱动系统内各组件之间的通信与交互。EDA 非常适合构建解耦、可扩展、实时响应的系统。
观察者模式 pub/sub
高性能设计的三个最重要的步骤
- 为架构做好“保护系统”:做好系统的流量控制;
- 使架构具备扩容能力:储备额外的计算资源,提升弹性扩容的速度;
- 提升系统各组件处理能力:识别高并发情境中的资源争抢情况,同时注意保留架构的可扩展性。
针对测试 ,建议使用“全链路生产压测”(就是在生产环境准备数据、进行压测),才能确认没有性能问题了
总结
任何复杂问题都可以被拆解为简单问题,只要拆解得足够细致。是思维能力是技术人的安身立命之本。