雪崩处理

常见的过载情况有两种:队列式过载,命令组合式过载。

队列式过载:

执行流间通过fifo的队列进行通信,比如udp套接字的缓冲区,后端同步地从队列中读出请求并处理,若是缓冲区设置过大,请求量一旦超过后端的能力,整个服务就会全面崩盘。

具体缓冲区长度设计:

         前端超时假设是T秒,后端能力是P,每个请求的大小是S,那么我们的缓冲区应小于T*P*S,假设前端超时200ms,后端能力是5000/S,每个请求的大小是300B,那么缓冲应小于:0.2*4000*300=240KB。(注:udp缓存也存放元数据,包大小300B实际占用的可能是500多B,需要根据实际情况计算)

         当然也有其它处理方式:给请求记录时间,或用异步的interface快速丢弃

 

命令组合是过载:

         假设过一个任务需要有N步请求组合起来,而且每一步都是关键步骤。假设是10步,单后端的失败率达到10%时,组合失败就是65%,自动重试和用户重试会加重系统发负载,整个服务就会几乎不可用了。

         处理方法:评估计算整个系统的最大负载,超过负载时在组合的第一步直接拒绝,delay用户重试的机会,可采取类似TCP重传的退让方式。