继续前一篇的讨论。前文中提到了两大类配额管理:基于带宽的以及基于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)的更多相关文章

  1. 关于Kafka配额的讨论(1)

    Kafka自0.9.0.0版本引入了配额管理(quota management),旨在broker端对clients发送请求进行限流(throttling).目前Kafka支持两大类配额管理: 网络带 ...

  2. Kafka配额讨论(流量限制)

    Kafka自0.9.0.0版本引入了配额管理(quota management),旨在broker端对clients发送请求进行限流(throttling).目前Kafka支持两大类配额管理: 网络带 ...

  3. kafka配额控制

    转载请注明地址http://www.cnblogs.com/dongxiao-yang/p/5217754.html Starting in 0.9, the Kafka cluster has th ...

  4. 关于Kafka __consumer_offests的讨论

    众所周知,__consumer__offsets是一个内部topic,对用户而言是透明的,除了它的数据文件以及偶尔在日志中出现这两点之外,用户一般是感觉不到这个topic的.不过我们的确知道它保存的是 ...

  5. kafka中的配额管理(限速)机制

    kafka支持配额管理,从而可以对Producer和Consumer的produce&fetch操作进行流量限制,防止个别业务压爆服务器.本文主要介绍如何使用kafka的配额管理功能. 1 K ...

  6. Kafka是分布式发布-订阅消息系统

    Kafka是分布式发布-订阅消息系统 https://www.biaodianfu.com/kafka.html Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apa ...

  7. DataPipeline |《Apache Kafka实战》作者胡夕:Apache Kafka监控与调优

    胡夕 <Apache Kafka实战>作者,北航计算机硕士毕业,现任某互金公司计算平台总监,曾就职于IBM.搜狗.微博等公司.国内活跃的Kafka代码贡献者. 前言 虽然目前Apache ...

  8. DataPipeline |ApacheKafka实战作者胡夕:Apache Kafka监控与调优

    https://baijiahao.baidu.com/s?id=1610644333184173190&wfr=spider&for=pc DataPipeline |ApacheK ...

  9. Spark Streaming揭秘 Day15 No Receivers方式思考

    Spark Streaming揭秘 Day15 No Receivers方式思考 在前面也有比较多的篇幅介绍了Receiver在SparkStreaming中的应用,但是我们也会发现,传统的Recei ...

随机推荐

  1. 我的摸索过程之IIS下配置asp.net 的注意事项

    "在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的.如果在 IIS 中没有将虚拟目录配置为应用程序,则可能导致此错误. ...

  2. iOS中用UILabel实现UITextView的占位文字

    @interface BSPublishTextView : UITextView /** 对外属性占位字符 placeholder */ @property (nonatomic, copy) NS ...

  3. JavaScript遍历XML总结

    1:读取服务器端xml(注意不同浏览器版本的区别),使用XML可以增强系统的扩展性,只用修改XML就可以实现增加减少功能的目的. function loadXMLDoc1(dname){     if ...

  4. Eclipse如何提高开发效率

    Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查) Ctrl+Shift+F4 关闭所有打开的Editer Ctrl+Shift+X 把当前选中的文本全部变为小写 Ctrl+Sh ...

  5. Spring,@Controller,@RequestMapping, @ResponseBody,@RequestParam

    1.@Controller,放在类的上方,使类生效; 2.@RequestMapping,,指定一个映射,method为访问方式,headers为含有指定请求头 3. @ResponseBody将返回 ...

  6. jquery作业

    1. 通过jquery动态的创建一个表格,随机生成(id自增,name随机2-3个中文汉字(10个姓,20个名字),age随机100以内整数)大于50小于100行的数据(用户对象:id,name,ag ...

  7. 动态规划:给出两个字符串s1和s2,返回其中最大的公共子串

    求公共子字符串问题(连续的) 这个题目是当时远景能源公司现场笔试的一道题目,当时根本就不知道动态规划是什么鬼,直接上来就暴力求解,面试官很谄媚的问我,你这能求出来吗?当时很年轻的说,能啊!现在想,当时 ...

  8. python22期第一天(课程总结)

    1.Python介绍: python是一门高级编程语言,涉及领域比较广泛,社区活跃,由一个核心开发团队在维护,相对其他语言,易于学习,可移植性强,可扩展性强,易于维护,有大量的标准库可供使用. 2.P ...

  9. 利用Python进行数据分析

    最近在阅读<利用Python进行数据分析>,本篇博文作为读书笔记 ,记录一下阅读书签和实践心得. 准备工作 python环境配置好了,可以参见我之前的博文<基于Python的数据分析 ...

  10. notepad++中双击选中字符串高亮颜色设置

    notepad++ 中最好用的功能就是双击选中,本文档中所有相同的内容高亮 不过有个问题就是当文档特别大,而且注释比较多的时候,我选中的内容高亮为绿色不太好找,那怎么设置呢? 设置--语言格式设置-- ...