常见的过载情况有两种:队列式过载,命令组合式过载。
队列式过载:
执行流间通过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重传的退让方式。