组合设计qps【重点】
1 原则
1.1 同步:
上游最大生产速度(总最大生产速度)==下游最大生产速度==qps==qps1 * qps2/qps1 + qps2 <min{qps1, qps2}
池n2==下游服务并发数(看客户端异步、服务端异步与并发事务处理数、连接数的关系),n2 <= n1,开多了也没用,当n2=n1时,整体吞吐量理论最大,但要视下游服务是否能承受n2并发
下游资源等待时间=n1/n2*t2-t2,当n1==n2时,等待时间为0
qps2>=当前总生产速度(用户生产)>qps时,理论上阻塞模型理论-下游无需做限流,因为上游qps定死了,只能放这些流量到下游,上游做限流(放弃用户请求);
但实际中,qps1>s>qps2>qps是可能发生的,上游服务由于未知原因没垮掉,而且出于自保偷偷多开并发放了超越qps的流量s,当s>qps2时,就要注意限流了限流怎么做(战略)
比如,用户-业务服务代码(2500qps)-db(500qps),组合qps 417,当用户生产>417时,一般也差不多要顶到qps2了,这也是为什么db一般要限流保护的原因
1.2 异步:
下游执行时间为0情况下(比如下游异步),上游最大生产速度(总最大生产速度)==下游最大生产速度==qps1
上游执行时间为0情况下,上游最大生产速度(总最大生产速度)==下游最大生产速度==qps2
n2无论设置多大,都是无穷大,因为异步情况下,t2约=0,n2与下游并发数脱离关系;
那么下游并发数与什么有关,看客户端异步、服务端异步与并发事务处理数、连接数的关系,如同步,则下游并发数仍==连接池大小n2,如异步,那并发数就不好说了
下游异步,qps2无穷大,上游最大生产速度(总最大生产速度)==下游最大生产速度==qps1,若qps1>qps2',可能压垮下游服务,要做限流限流怎么做(战略)
2 具体算法
以一个redis连接池应用为例:
2.1 同步
两种算法:
2.1.1 单线程耗时法
2.1.1.1 redis n2=n1,n=n1=n2=5,单线程响应时间=30+20=50ms,单线程qps=1/0.05=20,总qps=单线程qps*n=100
2.1.1.2 redis n2=1,n=n1=5,单线程响应时间=30+100=130ms,单线程qps=1/0.13=7.69,总qps=7.69*5=38.46
下游 连接池等待时间=n1/n2*t2-t2=80ms,执行时间20ms
2.1.2 公式法
2.1.2.1 业务线程qps=1/0.03*5=166.67,redisqps=1/0.02*5=250,总qps=100
2.1.2.2 业务qps=167,redisqps=1/0.02*1=50,总qps=38.56
2.2 异步
异步 qps2趋于无穷,qps=qps1,这也是为什么异步吞吐量大,qps恒<=qps1
========================================================================
草稿