流量控制
什么是流量控制?
网络传输中的流量控制就是让发送方发送数据的速度不要太快,这样可以让接收方来得及接收数据,通常使用滑动窗口的方式来实现。
滑动窗口是指在任意时刻,发送方都维持一个连续的允许发送的数据大小,称为发送窗口,接收方也会维持一个连续的允许接收的数据大小,称为接收窗口,每次发送方给接收方发送数据后,必须收到接收方返回的确认消息,发送窗口才可以向后移动,发送新的数据。
分布式系统中的流量控制是指控制每个服务器接收的请求数,以保证服务器来得及处理这些请求,尽可能保证用户请求持续地被处理,而不是让大量的用户请求“阻塞”在服务器中,等待被执行。
分布式系统流量控制策略
一般有两种流量控制策略:
- 漏桶策略
- 令牌桶策略
漏桶策略
漏桶策略是指无论用户请求有多少,无论请求速率有多大,“漏桶”都会接收下来,但是从漏桶出来的请求是固定速率的,保证服务器可以处理的游刃有余。当“漏桶”因为容量限制放不下更多请求时,就会选择丢弃部分请求,是一种“宽进严出”的策略。
漏桶策略的好处是做到了流量整形,即无论流量多大,即使是突发的大流量,输出依旧是一个稳定的流量。缺点是对于突发流量的情况,因为服务器处理速度与正常流量的处理速度一致,会丢弃比较多的请求。
漏桶策略适用于间隔性突发流量且流量不用即时处理的场景,这样可以在流量较小的“空闲期”,处理大流量时流入漏桶的流量。它不适用于流量需要即时处理的场景。
令牌桶策略
令牌桶策略是指有一个容器来盛放令牌,请求只有拿到令牌后,才会被分发到服务器进行处理。
令牌桶的优点是当有突发大流量时,只要令牌桶中有足够多的令牌,请求就会被迅速执行。令牌桶容量的设置,可以接近服务器处理的极限,这样就可以有效利用服务器的资源。
令牌桶策略适用于有突发特性的流量,且流量需要即时处理的场景。
漏桶策略和令牌桶策略的详细比较如下。
Sentinel流量控制原理
Sentinel的核心是监控应用的并发线程数或者QPS,当达到设置的阈值时,Sentinel才去一定的策略对流量进行控制,避免应用被瞬时高流量击垮,保证应用高可靠。
在Sentinel中,有两种流量控制方式:
- 通过并发线程数进行流量控制
- 通过QPS进行流量控制
在分布式系统中,每个请求都会由一个线程去处理,当请求太多系统处理不过来时,线程池可能已经被耗尽,因此当请求过多时,执行请求的并发线程数自然会随之增加,当超过一定阈值,需要采取策略进行流量控制。
在Sentinel中,采用了直接拒绝的方式,即新来的请求会被直接拒绝。
针对QPS,Sentinel提供了三种不同的流量控制策略:
- 直接拒绝,这与并发线程数流量控制采取的方式一直。
- 预热,看上去像一种特殊的令牌桶:放令牌的速率保持一个较低的水平,当流量突增时,放令牌的速率不会一下子提高到最高水平,而是慢慢增加,直到增加到最大速率,适用于具有突发特性的流量,且流量可以即时处理的场景。
- 匀速排队,本质是漏桶策略,严格控制系统每秒处理的请求数,当请求数很多时,请求之间的间隔也保持一致。