关于Kafka配额的讨论(2)
继续前一篇的讨论。前文中提到了两大类配额管理:基于带宽的以及基于CPU线程使用时间的。本文着重探讨基于CPU线程时间的配额管理。
定义
这类配额管理被称为请求配额(request quota),管理起来非常简单,能够调节的参数只有一个:request_percentage。该参数是一个百分比。假设设置为20,则表示20%,即Kafka broker线程处理客户端请求时不会超过20%的线程时间。根据官网描述,它严格的定义为:该配额指定了一个客户端在单个配额时间窗口(quota.window.size.seconds)内能够占用请求处理线程(request handler I/O thread)和网络线程(network thread)的最长时间百分比。这里简单解释一下这两个线程的区别:
- 请求处理线程:执行真正的请求处理逻辑,线程个数由num.io.threads指定,默认是8个
- 网络线程:处理broker与客户端之间的连接、请求发送、响应发送等事宜,线程个数由num.network.threads指定,默认是3个
简单来说,每当客户端发送请求给broker时,网络线程通过Socket接收请求后会放入一个请求队列,而请求处理线程定时从该队列中获取请求,处理之并将结果放入到响应队列,之后再由网络线程发送之。
okay,言归正传,定义请求配额的作用域是单个线程。也就是说,我们设置request_percentage = n,那么n生效的范围是一个线程,故这类配额的最大值就是(num.network.threads + num.io.threads) * 100。如果是默认参数的话就是1100。随着客户端向broker不断发送请求,broker会实时地比较当前请求处理时间百分比与该配额值的关系。一旦发现该值超过了预设的限定值则自动触发限速逻辑:等待一段时间后再返回response给客户端。至于如何计算出这段等待时间,请参加上一篇中的公式,这里不再赘述。
注意:以上给出的定义以及对定义的表述是根据官网KIP总结得来,我在这里想说一些不同的意见,如果各位看官有不同意见敬请批评指正。根据官网定义,它的理论最大值由两个线程相加后*100得出,但查询源代码之后我发现它计算的值实际上就是请求被处理的时间——即broker处理完请求的时间 - 请求从请求队列中出队的时间,因此这实际上和网络线程无关。
设置
下面来看如何设置。设置方法和之前给予带宽的配额设置方法一样,可以为client、user或user+client设置。比如下列命令就是给所有配置了client.id = clientA的客户端程序设置请求配额:
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { }
bin/kafkconfigs.sh --alter --add-config request_percentage=50 --zookeeper localhost:2181 --entity-type clients --entity-name clientA
这里详细说说request_percentage=50的含义。从上面的定义可知,这是表示50%,那么具体是什么意思呢? 它表示的是请求处理线程需要花费1秒的百分之多少去处理这个请求。假设broker端处理一个PRODUCE请求花费了430ms,那么我们说该broker花费了1秒的43%去处理请求,小于我们设定的50,因此该请求不会被限速,倘若处理某个PRODUCE请求花费了700ms,则当前配额值达到了70%,超过了50%,此时broker会开启限速逻辑延缓此PRODUCE请求的响应发送。
设置请求配额的意义
引入请求配额主要是为了防止客户端过快地发送请求从而彻底压垮broker。一个简单而有效的Dos攻击就是启动上百个设置了fetch.max.wait.ms = 0的consumer程序同时连入Kafka集群。另外, 请求配额实现了比较基础的CPU资源调度,这对于有Kafka多租户需求的用户来说也是一个非常好的选择。
监控
用户能够根据客户端提供的两个JMX指标来监控请求配额的执行情况:
- producer: produce-throttle-time-avg和produce-throttle-time-max,分别统计了该broker对PRODUCE请求进行限速的平均时间(毫秒)以及最大时间(毫秒)
- consumer:fetch-throttle-time-avg和fetch-throttle-time-max,分别统计了该broker对FETCH请求进行限速的平均时间(毫秒)以及最大时间(毫秒)
关于Kafka配额的讨论(2)的更多相关文章
- 关于Kafka配额的讨论(1)
Kafka自0.9.0.0版本引入了配额管理(quota management),旨在broker端对clients发送请求进行限流(throttling).目前Kafka支持两大类配额管理: 网络带 ...
- Kafka配额讨论(流量限制)
Kafka自0.9.0.0版本引入了配额管理(quota management),旨在broker端对clients发送请求进行限流(throttling).目前Kafka支持两大类配额管理: 网络带 ...
- kafka配额控制
转载请注明地址http://www.cnblogs.com/dongxiao-yang/p/5217754.html Starting in 0.9, the Kafka cluster has th ...
- 关于Kafka __consumer_offests的讨论
众所周知,__consumer__offsets是一个内部topic,对用户而言是透明的,除了它的数据文件以及偶尔在日志中出现这两点之外,用户一般是感觉不到这个topic的.不过我们的确知道它保存的是 ...
- kafka中的配额管理(限速)机制
kafka支持配额管理,从而可以对Producer和Consumer的produce&fetch操作进行流量限制,防止个别业务压爆服务器.本文主要介绍如何使用kafka的配额管理功能. 1 K ...
- Kafka是分布式发布-订阅消息系统
Kafka是分布式发布-订阅消息系统 https://www.biaodianfu.com/kafka.html Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apa ...
- DataPipeline |《Apache Kafka实战》作者胡夕:Apache Kafka监控与调优
胡夕 <Apache Kafka实战>作者,北航计算机硕士毕业,现任某互金公司计算平台总监,曾就职于IBM.搜狗.微博等公司.国内活跃的Kafka代码贡献者. 前言 虽然目前Apache ...
- DataPipeline |ApacheKafka实战作者胡夕:Apache Kafka监控与调优
https://baijiahao.baidu.com/s?id=1610644333184173190&wfr=spider&for=pc DataPipeline |ApacheK ...
- Spark Streaming揭秘 Day15 No Receivers方式思考
Spark Streaming揭秘 Day15 No Receivers方式思考 在前面也有比较多的篇幅介绍了Receiver在SparkStreaming中的应用,但是我们也会发现,传统的Recei ...
随机推荐
- git使用中checkout生成临时br的问题(吓出一身冷汗啊)
git中几天前漫不经心的使用了git checkout ver_hash的命令,结果push到远程库都提示everything is up-to-date,实际神马都没提交上去啊!但看本地log中的确 ...
- Linux命令之文件搜索
locate 文件名 locate只能搜索文件名,不能搜索文件大小.搜索速度快. locate并不会搜索到那些新加入的文件.新加入文件后,使用updatedb,更新数据库后,再使用locate搜索. ...
- python的logging模块之读取yaml配置文件。
python的logging模块是用来记录应用程序的日志的.关于logging模块的介绍,我这里不赘述,请参见其他资料.这里主要讲讲如何来读取yaml配置文件进行定制化的日志输出. python要读取 ...
- JS基础:闭包和作用域链
简介 一个定义在函数内部的函数与包含它的外部函数构成了闭包,内部函数可以访问外部函数的变量,这些变量将一直保存在内存中,直到无法再引用这个内部函数. 例如: var a = 0; function o ...
- vue中get和post请求
import axios from 'axios'; import router from '@/router'; import { setSessionStorage, getSes ...
- C++笔记019:C++中的const修饰的是一个真正的常量
原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 程序一: 我们知道数组的下标不能为变量,必须是一个确定的值.在C语言中看程序: #define a 10 int main() { //第 ...
- SEO优化:浅析关键词出现在网站哪些地方更有利?
关键词出现在网站哪些地方符合SEO?进行网站的SEO时,关键词需要出现在整个网站的适当地方.下面列出几个重要的关键词摆放的地方.以下列出的10个地方希望能够帮助到大家. 1.网站Title部分. 2. ...
- First Scala
注意的两点: 1. Class or Objcect 在Scala把类和对象明确的分开了. Class相当于模板:Object是Class的实现. 2. main 要测试代码必须使用main def ...
- uedit,检测粘贴事件,替换粘贴内容
vue.editor.addListener("beforepaste",function(type, arg1, arg2){arg1.html="ddddddd&qu ...
- 算法训练 2的次幂表示(蓝桥杯C++写法)
问题描述 任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001. 将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0 ...