什么是Quota
quota也就是配额,配额顾名思义就是对某个事物添加一定量额度的限制。
在Kafka中,这代表server可以通过某些方式,来限制client的请求速率/请求数据量。
为什么要有Quota
既然知道了quota是什么,自然也很容易理解为什么要有这个特性。
在kafka中,每个server需要处理大量的请求,其中包括但不限于以下几种:
- server彼此间的数据同步:如metadata、数据备份等。
- producer发送数据
- consumer拉取数据
在一个多租户(指多个不同的业务)的集群中,如果不加限额,那么其中一小部分的客户端可能会对整个集群造成影响。例如A业务的请求速率和数据量都很大,阻塞了server,导致server无法为B、C、D等业务提供服务。
因此为了避免一小部分clients而影响整个集群的服务,我们可以对这一部分clients添加限额,从而保证整个集群的平稳运行。
Quota的类型
对于quota的类型可以从两个方面进行分类:
1.如何限制clients
2.可以限制clients的哪些方面
如何限制clients
三种方式:
- 基于用户user:可以理解为通过user对多个client进行逻辑分组
- 基于client-id:指定单个的client,也可以将多个client指定为同一个clinet id
- 基于client的ip
kafka在进行限额时,都是通过上述形式来实现的。
限制哪些方面
- 网络带宽:也就是clients能够从server获取的数据量,以每秒字节数(Bps)为单位
- 请求速率:表示client可以使用的cpu的总百分比。
官网描述如下:
Request rate quotas are defined as the percentage of time a client can utilize on request handler I/O threads and network threads of each broker within a quota window. A quota of `n%` represents `n%` of one thread, so the quota is out of a total capacity of `((num.io.threads + num.network.threads) * 100)%`. Each group of clients may use a total percentage of upto `n%` across all I/O and network threads in a quota window before being throttled. Since the number of threads allocated for I/O and network threads are typically based on the number of cores available on the broker host, request rate quotas represent the total percentage of CPU that may be used by each group of clients sharing the quota.
翻译一下:
请求速率配额定义为客户端在每个配额窗口内可以使用的每个broker请求处理I/O线程和网络线程的时间百分比。
`n%`的配额代表一个线程的`n%`,因此配额的总容量为`((num.io.threads + num.network.threads) * 100)%`。每组客户端在被限流之前,可以在一个配额窗口内使用所有I/O和网络线程的总百分比最多为`n%`。由于分配给I/O和网络线程的线程数通常基于broker主机上可用的核心数,请求速率配额代表了每组共享配额的客户端可以使用的CPU总百分比。
还是有点不太好理解,我们举个例子:
假如我们现在有一个Kafka broker,该broker有8个I/O线程(num.io.threads = 8),四个网络线程(num.network.threads = 4)。
一个线程其容量(或者说可以被占用的时间)是100%,那么broker的总容量为(8+4)* 100% = 1200%,这代表该broker所有线程总共的处理能力。
现在我们给某个client设置配额为 10 %,那么就意味着:
- 这个client可以完全占用1.2个线程的处理能力;
- 或者说这个client可以占用12个线程中每个线程10% 的处理能力;
因此这里的请求速率不是简单的每秒请求数,而是一组的client(通过user/client-id配置)可以使用的cpu的百分比。
相关链接
相关ISSUE
KAFKA-18808