应对「高并发」的思路
共 3705字,需浏览 8分钟
·
2021-05-15 23:13
这里是Z哥的个人公众号
每周五11:45 按时送达
当然了,也会时不时加个餐~
我的第「191」篇原创敬上
TPS。每秒事务处理量,这里的事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。(以客户端为视角)
QPS。每秒查询率,可以通过并发量 / 平均响应时间计算得出。(以服务端为视角,一个TPS可能会对应多个QPS)
并发用户数。系统可以同时承载的正常使用系统功能的用户的数量。
响应时间。很多时候也叫RT,是指系统对请求作出响应的时间。
带宽。如果是一个数据传输量比较大的业务,还需要考虑带宽问题,比如视频、音频类应用程序。
获取购物车列表,存在两次调用,QPS = 200。
批量获取商品库存,存在三次调用,QPS = 300。
获取会员信息,存在一次调用,QPS = 100。
……
获取购物车列表,出现在三个业务线,QPS = 200 + 500 + 100 = 800。
批量获取商品库存,出现在两个业务线,QPS = 300 + 200 = 500。
获取会员信息,出现在两个业务线,QPS = 100 + 200 = 300。
……
先在代码层面做优化,比如代码性能,多线程,请求合并,池化(连接池、线程池、对象池等等)。
能升级硬件的就升级硬件。
能用缓存解决的坚决不做系统拆分。并且,缓存尽可能做到上游。比如, cdn >页面> api > service 。
如果在数据处理上产生瓶颈,那么优先考虑业务上是否接受异步,如果接受,那么用 MQ 来削峰填谷。或者限流降级。
如果 MQ 也不顶用,是整体吞吐量上的瓶颈的话,只要不是写数据的瓶颈,尽量通过程序拆分而不是数据库拆分来解决问题。(此时需要引入服务治理,另外,会存在一致性问题,数据合并问题要解决)
非得动到数据层面的话,优先考虑数据库读写分离,而不是直接拆分数据。
实在迫不得已需要拆分数据,优先考虑根据业务垂直拆分,而不是水平拆分。(水平拆分的数据合并代价会比垂直拆分更大)
最后才是数据库水平拆分,支持无限扩容,一劳永逸。
梳理请求流转链路
确定目标
制定具体的优化方案
推荐阅读:
原创不易,如果你觉得这篇文章还不错,就「点赞」或者「在看」一下吧,鼓励我的创作 :)
也可以分享我的公众号名片给有需要的朋友们。
如果你有关于软件架构、分布式系统、产品、运营的困惑
可以试试点击「阅读原文」