限流算法比较流行的主要包括令牌桶算法和漏斗算法,个人感觉这两个比喻还是比较原始不够贴切。
我们可以拿演唱会或者火车站的进站过程来对限流算法进行对比。
-
令牌桶算法
可以类比为演唱会入场券的自动发券机,观众需要经过自动发券机拿到入场券之后才能入场。自动发券机每隔10s钟会吐出一张入场券,如果有人拿了入场券就会吐出下一张,如果没有人拿则会停止吐券。
可以想象,通过这种方式进行发放入场券,可以保证用户的入场平均间隔不会比10s更短,从而达到了限流的效果。 -
漏斗算法
可以类比为火车站的进站流程,进站前需要进行安检,安检门前面会竖立一条长长的排队线。我们假设队列的长度是固定的,如果队列过长,一般情况下车站管理人员都会限制该队列的排队人数。 由于安检的效率大致是匀速的,因此实际安检口入口的乘客进站速度都是固定的,也就是不论有多少乘客突然涌进安检队列,安检的入口都是匀速进入的,这也就达到了车站限流的效果。
综合上面两种场景,可以看到两种算法虽然描述上有些区别,实际上都是基于队列和固定的放行频率实现的限流算法,只不过令牌桶算法放出的是凭证,而漏斗算法放出的是具体的执行。而这种不同将会为限流算法带来以下不同。
- 令牌桶凭证可以积压并一次放出,也就是说如果自动发券机上如果最多可以同时存放10张入场券,则极有可能同时来了10个观众同时拿到入场券并同时挤进演唱会。也就是说令牌桶实现的是统计学上的限流。
2.漏斗算法主要依靠缓存队列来应对流量洪峰,显然,当流量洪峰到来时,大部分请求将会被缓存在队列中等待执行,也就是实时性和响应能力会受到影响。而令牌桶算法则具有一定的洪峰适应性,在平均值不变的情况下,最小化的减少用户体验的影响。
网友评论