继续前一篇的讨论。前文中提到了两大类配额管理:基于带宽的以及基于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. jQuery结合lhgdialog弹出窗口,关闭时出现没有权限错误

    背景: 最近的项目,使用JQuery+lhgdialog窗口组件方式模拟弹窗,在关闭lhgdialog窗口时,出现以下错误: >jQuery没有权限 >调试时 w.readyState没有 ...

  2. 你不能错过.net 并发解决方案

    BlockingCollection集合是一个拥有阻塞功能的集合,它就是完成了经典生产者消费者的算法功能.所以BlockingCollection 很适合构造流水线模式的并发方案 BlockingCo ...

  3. MongoDB学习笔记(二)

    一.Mongodb命令 说明:Mongodb命令是区分大小写的,使用的命名规则是驼峰命名法. 对于database和collection无需主动创建,在插入数据时,如果database和collect ...

  4. Oracle表空间和表的常用操作指令

    查看端口号指令 netstat –a 设置: set pagesize 100; //设置每页显示的行数set linesize 200; //设置每页显示的字符数 空格也算col 列名A for a ...

  5. js中获取方法名

    var tmp = arguments.callee.toString(); var re = /function\s*(\w*)/i; var matches = re.exec(tmp);//方法 ...

  6. Java内存模型与指令重排

    Java内存模型与指令重排 本文暂不讲JMM(Java Memory Model)中的主存, 工作内存以及数据如何在其中流转等等, 这些本身还牵扯到硬件内存架构, 直接上手容易绕晕, 先从以下几个点探 ...

  7. Django push: Using Server-Sent Events and WebSocket with Django

    http://curella.org/blog/2012/jul/17/django-push-using-server-sent-events-and-websocket/ The goal of ...

  8. ZAB协议(Zookeeper atomic Broadcast)

    一.简语: ZAB协议是Paxos算法的经典实现 二.ZAB协议的两种模式: 崩溃恢复: 1.每个server都有一张选票(myid,zxid),选票投给自己 2.收集所有server的投票 3.比较 ...

  9. Rafy 开源贡献中心 - 组织成立,并试运行一月小结

    背景 最近两年,工作中虽然大量使用了 Rafy 框架作为各个产品.项目的开发框架.我是 2015 年的年中加入现在这家公司的,由于我个人工作太忙的缘故,一直没怎么编码,Rafy 框架底层的核心成长也比 ...

  10. Java并发之AQS详解

    一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQ ...