Kafka64 条

客户端配额限流

配额(quota)用于限制单个用户或客户端对集群资源的占用:按字节速率限制生产/消费,或按请求比例限制 CPU 使用,防止单客户端影响集群整体。

客户端配额限流是什么

Kafka 配额(client quotas)用于限制单个用户或单个 client-id 对集群资源的占用,主要有三类:producer_byte_rate 限制生产字节速率,consumer_byte_rate 限制消费字节速率,request_percentage 限制该客户端可用请求线程的比例(约当 CPU 占用)。配额可以作用在 user、client-id 或两者组合(user + client-id)上,并支持 default 默认项。命中配额后客户端不会被拒绝,而是被限速(broker 短暂延迟响应),表现为吞吐下降与超时增多。

基本信息

实体类型users、clients(client-id)、users+clients,均可加 default
常见配置项producer_byte_rate、consumer_byte_rate、request_percentage
生效位置broker 端,按实体匹配后限速
变更方式kafka-configs.sh 动态修改,或配置文件加 ZK/KRaft 参数
典型用途防止单个业务压垮共享集群

典型使用场景

  • 多租户共享集群:给每个业务系统设置生产与消费速率上限,保证互不干扰
  • 防止单个客户端的大量 fetch 请求占满请求处理线程,影响其他客户端
  • 压测期间限制测试客户端流量,避免影响生产消费
  • 新接入方上线时先设保守默认配额,稳定后再按实际流量调整
  • 故障隔离:某客户端异常重试风暴时,配额能限制其影响面

设置与查看配额

设置与查看配额
# 为用户设置生产与消费速率配额(单位:字节/秒)
kafka-configs.sh --bootstrap-server localhost:9092 \
  --entity-type users --entity-name app-order \
  --alter --add-config 'producer_byte_rate=1048576,consumer_byte_rate=2097152'

# 为 client-id 设置请求比例配额
kafka-configs.sh --bootstrap-server localhost:9092 \
  --entity-type clients --entity-name order-consumer \
  --alter --add-config 'request_percentage=200'

# 查看配额
kafka-configs.sh --bootstrap-server localhost:9092 \
  --entity-type users --entity-name app-order --describe
kafka-configs.sh --bootstrap-server localhost:9092 --entity-type users --entity-default --describe

三类配额对照

配置项限制对象单位命中表现
producer_byte_rate生产字节速率字节/秒生产吞吐下降、重试增多
consumer_byte_rate消费字节速率字节/秒消费变慢、lag 上升
request_percentage请求线程占用比例百分比(相对单线程)请求排队、响应变慢
user + client-id更细粒度的组合同上优先级高于单一实体配额
配额是限速而不是拒绝:被限速的客户端会快速堆积发送缓冲并报出超时,排障时要先看是否命中了配额指标,再去怀疑网络与 broker 负载。
实体匹配有优先级顺序:更具体的 user + client-id 优先于单一实体,单一实体优先于默认项;排查“为什么限速值和我设的不一样”时先按这个顺序核对。
对所有用户设置过低的默认配额会全面拖慢业务,配额应按租户评估后再设,改完要观察一段时间再固化。

易错点

  • 对所有用户设置过低默认配额,集群整体吞吐被拖慢,业务方在应用侧先报超时
  • 配额与网络限速、客户端自身限速叠加,形成双重限制,变更前不核对已有配置
  • 设置配额后不观察命中指标,客户端吞吐下降被误判为 broker 或网络故障,排查方向跑偏
  • 生产与消费只设一侧,另一侧仍然把集群带宽吃满,实际隔离效果有限

数据来源与参考

  • Apache Kafka 官方文档:Client Quotas
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌