大白话讲讲限流、漏桶和令牌桶

限流

所谓限流,核心点是限制流出,而不是流入。

怎么理解这句话?

比如去医院看病,如果人非常多的话,很大概率在进去之前,一群人就被拦在大门外排队,那扇门就是限流器。

每个时间段来看病的人数是不可控制的,因此限流器的流入是不可控制的,能做的是控制每段时间通过这个门的人数,也就是真正进入医院的人数。

漏桶和令牌桶

限流有几个常用的算法,比如漏桶和令牌桶。

漏桶就是从排队的人里面,每经过一段时间固定放进去几个人。

令牌桶就是每次进去之前,都要领一个号(令牌),拿到号才能进去,每段时间固定发放几个号。

当然这里我们假设排的队可以无限长,实际上不管是漏桶还是令牌桶,都是有大小的,漏桶里装的是请求,满了就拒绝服务了,令牌桶里装的是令牌,满了令牌只能溢出。

流量突增的场景

这两者之间虽然大体上功能一致,细节上还是有一些微妙的差异。比如令牌桶可以支持一定程度上的流量突增。

如果某个时间段人来的少比如6点,刚才讲号可以堆积,但不能无限堆积,超过一定量就废弃了。

如果堆积了一定的号,下一波人多的时候,比如8点,就可以多一点人一起进去。

而漏桶实际上并不具备这样的能力。

并发和时延

既然前面讲了限流,那最后再扯几句关于系统容量很关键的衡量指标:并发和时延。

大部分时候我们的说想设计一个支持高并发、低时延的系统。好像这俩概念永远是一起出现的。实际上,它们是从两个维度在看问题。

还是以医院为例,当只有一个医生坐诊的时候,系统能支持的并发数是1。

假设看病平均会花10分钟,那么时延就是10分钟。也就是一个请求发过去,rt(response time)是10分钟。

用并发数除以时延,那整个医院的每分钟能处理0.1个病人。这个就是系统所谓的吞吐量。

如果说要把吞吐量提高一倍,可以有2个办法:再增加一个医生,原来的大家排成一队变成两队一起处理。从这个角度来说,并发增加了,但是时延是不变的。

或者说通过各种先进的设备,把平均一个人看病的时间缩短到5分钟。从这个角度来说,时延变短了,并发不变。

当然,这里用的比喻,2个医生之间各看各的病,互相没什么影响,也就是说如果把医生数提高到10个,吞吐量就水平扩了10倍。这是比较理想的情况。

而再实际的秒杀场景下,由于可能会共享一些资源(比如数据库)使得系统无法做到完全的水平扩容。

没想到原来想顺带提一下的点比正文更长了,希望讲清楚了关于秒杀的一些基本概念。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章