组合设计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

 

========================================================================

草稿 

原文地址:https://www.cnblogs.com/silyvin/p/12079785.html