这次咱们从根源聊:16招搞定高并发架构设计(16)

常见的限流算法有这么几种:

计数器算法。最简单的算法,资源使用加一,释放减一,达到一定的计数拒绝服务。令牌桶算法。按照固定速率往桶里加令牌,桶里最多存放n个令牌,填满丢弃。处理的时候需要获取令牌,获取不到则拒绝请求。漏桶算法。一个固定容量的漏洞,按照一定的速度流出水滴(任务)。可以以任意速度流入水滴(任务),满了则溢出丢弃。令牌桶算法限制的是平均流入速度,允许一定程度的突发请求,漏桶算法限制的是常量的流出速率用于平滑流入的速度。

实现上,常用的一些开源类库都会有相关的实现,比如google的Guava提供的RateLimiter就是令牌桶算法。之后我们会介绍熔断,熔断针对的是客户端保护,限流针对的是服务端保护。

4、降级

降级往往不是一个纯技术手段,需要结合业务一起来考虑,比如:

对于送外卖,计算商家和送餐地点距离的时候,最好的方式是使用骑行距离,骑行距离需要调用外部地图API来得到,在外部地图API访问超时的时候需要考虑降级方案,把骑行距离改为根据经纬度算出来的直线距离,虽然不精确,导致配送时间的估算不精确,但是也至少让服务基本可用对于电商需要做的超大访问量的促销活动页面在动态请求因为过载无法响应的时候,是否可以考虑降级为客户端这边之前写死的一些静态的活动商品列表,虽然这个列表无法反映当前活动实际的(商品售卖)情况,但是至少这个活动页是可看的之前我们遇到过携程在出现服务宕机的时候直接降级为让用户去访问艺龙,这种属于整站降级,某些业务场景下甚至我们可以尝试在线上业务整站宕机的时候可以降级为人工客服处理部分业务说白了降级往往是一个兜底方案,需要在做设计的时候结合业务场景考虑哪些环节可能会出问题,出了问题如何降级,是自动降级还是手动降级,降级后需要启用怎么样的应急处理流程等等。

推荐阅读