如何降低QPS(错峰、限流、削峰)

服务端每秒流量处理能力是通过QPS衡量的,最大QPS(峰值)就是对服务端抗压能力的衡量指标,如果来自客户端的流量超过了服务端最大QPS,要么服务端发生宕机,要么将超过能力范围内的请求忽略掉,返回限流错误给客户端,两者都造成用户体验的崩塌和品牌受损。

策略概括起来就三点:错峰限流、削峰,本质上都是为了降低QPS。

一、错峰策略

“错峰”,顾名思义就是将请求峰值错开,服务端的QPS峰值可以看做是一系列的小QPS峰值请求的叠加,因此通过一些技术手段来错开这些小峰值,有效降低最大QPS。我们可以从服务端和客户端两个维度来错峰。

1.1 服务端错峰策略

如果触发客户端的请求动作是通过服务端主动下发实现的,比如PowerMsg支持服务端主动下发,那么服务端可以分批下发给客户端(假设所有服务端到客户端的时延RT是一样的)。

 

1.2 客户端错峰策略

常用的客户端错峰策略采用的是随机算法,假设所有客户端接收要触发请求动作的时间是一样的,给定一个时间T,客户端采用随机延迟,t时刻再去触发请求动作,其中t在[0,T]时间段内随机。

 

从大量数据来看,这个公式可以保证 t 在区间 [0, T] 之间均匀分布。那么理论上新的最大QPS等于老的最大QPS除以T。

 

二、限流策略

服务端基本都会做限流,比如Mtop限流之后返回对应的限流错误码。下面主要介绍客户端限流。客户端限流主要目标是消除频繁或不必要的请求。

  • 用户已经到达最大请求次数,就不去请求;
  • 用户已经被限流,则延迟再去第二次请求;
  • 用户已经拿到所要的返回结果,则不再去请求。

三、削峰策略

削峰,也就是消除峰值的最大QPS,有几种削峰策略。

3.1 设置两次请求最小有效时间间隔

设置两次请求最小有效时间间隔,假设最小时间间隔是t,那么在小于t的时间的请求都视为无效请求,忽略掉。像红包雨这类频繁请求的活动,该策略非常有效。

例如上图,红色是有效请求,灰色是无效请求,灰色也就不会向服务端发送请求。假设t秒内只有一次有效请求,那么1秒内,有1/t次有效请求,用户量是Q,那么最大QPS如下(假设所有的用户都是同时开始请求,间隔时间一致):

3.2 概率请求策略

如果不想每次都让用户去请求,给用户请求的动作加一个概率P,那么每次发送请求的概率就是P,这个时候需要结合3.1的策略去控制用户的每秒请求次数。最大QPS公式如下:

通过控制t和P的值,就可以灵活控制最大QPS范围。这里有一个问题,就是根据概率容易产生极端请求,比如:

大量数据就容易产生大量的极端请求,违反公平性原则,就需要用到公平性策略。

 

3.3 公平性策略

这里提供一种公平性策略的方式,随机算法+插值算法,生成有效请求序列。

每个用户一次活动周期内有效请求概率是P,比如概率0.2,也就是5次中1次请求机会,或者10次中2次请求机会。根据随机算法+插值算法生成请求序列:

 

根据上述方式就可以得到公平性策略,粒度可以自由把控。

通过上述错峰、限流、削峰方式,达到降低QPS的目的。通常,一场大促需要上述几种方案的结合。

一个有关“如何降低QPS(错峰、限流、削峰)”的想法

发表评论