继续前一篇的讨论。前文中提到了两大类配额管理:基于带宽的以及基于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. hadoop分布式安装部署详细视频教程(网盘附配好环境的CentOS虚拟机文件/hadoop配置文件)

    参考资源下载:http://pan.baidu.com/s/1ntwUij3视频安装教程:hadoop安装.flvVirtualBox虚拟机:hadoop.part1-part5.rarhadoop文 ...

  2. Twemproxy分析

    twemproxy(又称为nutcracker)是一个轻量级的Redis和Memcached代理,主要用来减少对后端缓存服务器的连接数. 由Twitter开源出来的缓存服务器集群管理工具,主要用来弥补 ...

  3. windows下nginx+php

    nginx能够为Web服务器节省资源,相较于我们熟悉的apache.IIS的优势,在于"反向代理"和"负载均衡".那在windows下如何来配置nginx+ph ...

  4. Gulp基础知识

    首先,我们需要了解Gulp能做些什么? 编译 sass                                        sass是什么?(使CSS可以用编程的方式写,加快我们开发的速度) ...

  5. 什么才是java的基础知识?

    近日里,很多人邀请我回答各种j2ee开发的初级问题,我无一都强调java初学者要先扎实自己的基础知识,那什么才是java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考. ...

  6. P1352 没有上司的舞会

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

  7. Go碎碎念

    1. 时间类型转换为字符串类型 now := time.Now() fmt.Println(now.Format("2006-01-02 03:04:05 PM")) yester ...

  8. strtok函数读写冲突问题

    先上测试代码 #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int a ...

  9. 界面渐变特效 -- CSS实现 -- 兼容IE8

    特别注意:里面的RGB颜色值必须要全写,不能使用缩写.左右:background: -webkit-gradient(linear, 0 0, 0 100%, from(#80c1e7), to(#2 ...

  10. Python 3 利用 Dlib 19.7 实现摄像头人脸识别

    0.引言 利用python开发,借助Dlib库捕获摄像头中的人脸,提取人脸特征,通过计算欧氏距离来和预存的人脸特征进行对比,达到人脸识别的目的: 可以自动从摄像头中抠取人脸图片存储到本地: 根据抠取的 ...