关于控制Broker端入站连接数的讨论
Kafka Broker端处理请求采用Reactor模型。每台Broker上有个类似于Dispatcher的Acceptor线程,还有若干个处理请求的Processor线程(当然真正处理请求逻辑的线程不是Processor,实际上是KafkaRequestHandler)。每个Processor线程启动后大致做以下这么几件事情:
1. 设置新的入站连接
2. 处理新的请求响应(所谓的处理也就是放入到响应队列中)
3. 执行Selector.select操作获取那些准备完毕的IO操作
4. 接收新的入站请求
5. 执行已发送响应的回调逻辑
6. 处理已断开连接
每个Broker启动之后它创建的Processor线程会不停地执行以上这些动作,循环往复,直至Broker被关闭。
我们重点看看第一步中的逻辑,以下是1.1.1版本的源码(选择1.1.1版本不是特意的,其实所有2.3版本之前都是差不多的情形):
/**
* Register any new connections that have been queued up
*/
private def configureNewConnections() {
while (!newConnections.isEmpty) {
val channel = newConnections.poll()
try {
debug(s"Processor $id listening to new connection from ${channel.socket.getRemoteSocketAddress}")
selector.register(connectionId(channel.socket), channel)
} catch {
// We explicitly catch all exceptions and close the socket to avoid a socket leak.
case e: Throwable =>
val remoteAddress = channel.socket.getRemoteSocketAddress
// need to close the channel here to avoid a socket leak.
close(channel)
processException(s"Processor $id closed connection from $remoteAddress", e)
}
}
}
注意我标成红色的语句。基本上Processor线程设置新入站连接的方式就是一次性处理完才罢休。代码中的newConnections是java.util.concurrent.ArrayBlockingQueue实例。Acceptor线程也会访问newConnections,因此必须是线程安全的。
这种一次性处理完成才收手的做法在某些情况下是有风险的,比如当Kafka集群遭遇到DDOS攻击时,外部IP会创建海量的入站连接全部砸向newConnections中。此时Processor线程运行时会一直尝试消耗掉这些新连接,否则它不会干其他事情——比如处理请求等。换句话说,目前Kafka对新入站连接的处理优先级要高于已有连接。当遭遇连接风暴时,Kafka Broker端会优先处理新连接,因此可能造成已有连接上的请求处理被暂停,并最终导致超时。这样客户端得到请求超时通知后会会进一步地发送新的请求,因而出现雪崩效应。
另外Broker端维护每个连接也不是没有开销的。连接信息本身肯定要占用一些内容资源。如果是启用了SSL的连接,Kafka为额外为其维护一个48KB的临时缓冲区。因此一旦遭遇连接风暴,OOM错误是很常见的。
鉴于这些原因,社区在2.3版本改进了Broker端处理新连接请求的方式。首先阻塞队列保存新连接的个数不再是没有限制了,而是被固定为20,即每个Processor的新连接队列最大就是20个连接——这个写死在代码里面了,目前没法修改。第二、社区引入了新参数max.connections,用于控制Broker端所允许连接的最大连接数。你可以调节这个参数来控制一个Broker最多能接收多少个入站连接。这个参数可以在server.properties中被设置,也可以使用kafka-configs脚本动态修改。max.connections是全局性的,你也可以给每个监听器设置不同的连接数上限。比如你的监听器中同时使用了PLAINTEXT和SSL,那么你能够使用listener.name.plaintext.max.connections和listener.name.ssl.max.connections来为这两个listeners配置各自的连接数,命令如下:
$ bin/kafka-configs.sh --bootstrap-server localhost:9092 --entity-type brokers --entity-name 0 --alter --add-config max.connections=100$ bin/kafka-configs.sh --bootstrap-server localhost:9092 --entity-type brokers --entity-name 0 --alter --add-config listener.name.plaintext.max.connections=80
Completed updating config for broker: 0. $ bin/kafka-configs.sh --bootstrap-server localhost:9092 --entity-type brokers --entity-name 0 --alter --add-config listener.name.ssl.max.connections=80
Completed updating config for broker: 0.
第三是Kafka Broker的每个Processor线程会在每轮任务结束之前尝试去关闭多余的连接。判断是否需要关闭多余连接的依据有两点:1. 总的连接数超过了max.connections值;2. 你为Broker设置了多个监听器,但Kafka会保护Broker内部连接使用的那个监听器。比如你如果设置了多个监听器:PLAINTEXT://9092, SSL://9093,SASL://9094,然后设置inter.broker.listener.name=SSL,那么SSL这套监听器下的连接是不会被Processor强行关闭的。
最后提一句,如果所有Processor的阻塞队列都满了, 那么前面的Acceptor线程会阻塞住,不会再接收任何入站请求。社区新增加了一个JMX指标来计算Acceptor线程被阻塞的时间比例:kafka.network:type=Acceptor,name=AcceptorBlockedPercent,listener={listenerName}
关于控制Broker端入站连接数的讨论的更多相关文章
- Windows防火墙出站、入站相关知识总结
出站默认是全部允许,只禁止相关出站规则指定的条目:入站默认是全部禁止,只允许相关入站规则指定的条目. 入站规则其实没什么好说的,直接添加规则允许某IP或端口访问,或允许某程序全部访问,就行了. 要控制 ...
- 模块和处理程序之通过HttpModule和HttpHandler拦截入站HTTP请求执行指定托管代码模块
1.简介 大多数情况下,作为一个asp.net web开发对整个web应用程序的控制是十分有限的,我们的控制往往只能做到对应用程序(高层面)的基本控制.但是,很多时候,我们需要能够低级层面进行交互,例 ...
- kafka部分重要参数配置-broker端参数
broker端参数主要在config/server.properties目录下设置: 启动命令:nohup ./kafka-server-start.sh -daemon ../config/serv ...
- Kafka源码分析及图解原理之Broker端
一.前言 https://www.cnblogs.com/GrimMjx/p/11354987.html 上一节说过,任何消息队列都是万变不离其宗都是3部分,消息生产者(Producer).消息消费者 ...
- windows中的出站和入站规则
一.规则介绍 规则生效的前提是防火墙处于开启状态. windows系统默认的规则:默认阻止入站连接,默认允许出站连接.也就是说,凡是入站连接,任何程序和端口都要在防火墙上配置入站规则,否则都会被禁止. ...
- Dynamics AX 2012 R2 在增强入站端口中找不到自定义服务操作
Reinhard写好自定义服务A,添加好服务操作A1,A2,A3..... 然后,Reinhard在增强的入站端口,选择服务操作时,却找不到这些A1,A2,A3. 查找相关资料 ...
- L10 数据入站、转发、出站流程
二 写出防火墙规则链之间的顺序也就是入站数据流向.转发数据流向.出站数据流向的过程 入站:PREROUTING→INPUT 数据包到达防火墙,由prerouting处理,判断是否修改地址 路由选择:判 ...
- 利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
我比较喜欢听音乐,特别是周末的时候,电脑开着百度随心听fm,随机播放歌曲,躺在床上享受.但碰到了一个烦人的事情,想切掉不喜欢的曲子,还得起床去操作电脑换歌.于是思考能不能用手机控制电脑切换歌曲,经过一 ...
- Windows Server 2008 R2防火墙入站规则
一般服务器的端口都设置了外网无法访问,iis中创建的网站外网也是访问不了的,需要创建指定端口的入站规则后方可访问. 方法/步骤 服务器管理器-->配置-->高级安全windows防 ...
随机推荐
- vue大文件上传控件选哪个好?
需求: 项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在20G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以20G来进行限制. PC端全平台支持,要求支持Window ...
- zzulioj - 2623: 小H的作业题
题目链接:http://acm.zzuli.edu.cn/problem.php?id=2623 题目描述 期末考试即将来临,同学们都积极的在图书馆复习.今天小H也来到图书馆复习,小H掏 ...
- ESP8266 LUA脚本语言开发: 测试下诱人的程序
前言 这一节测试一下诱人的程序 实现的功能,APP通过SmartConfig给Wi-Fi模块配网并绑定设备,然后通过MQTT远程控制开发板的继电器, APP显示ESP8266采集的温湿度数据. 简而言 ...
- ESA2GJK1DH1K升级篇: STM32远程乒乓升级,升级流程源码详细说明
前言 1.BootLoader程序,升级简要流程图 2.其实主要的就是把程序文件写入环形队列,然后环形队列取出来数据写入Flash 3.用户程序,简要流程图 下面的读一下,有个印象就可以: 说白了就是 ...
- V8 引擎如何进行垃圾内存的回收?
JS 语言不像 C/C++, 让程序员自己去开辟或者释放内存,而是类似Java,采用自己的一套垃圾回收算法进行自动的内存管理.作为一名资深的前端工程师,对于JS内存回收的机制是需要非常清楚, 以便于在 ...
- leetcode 947. 移除最多的同行或同列的石头
题目描述: 在二维平面上,我们将石头放置在一些整数坐标点上.每个坐标点上最多只能有一块石头. 现在,move 操作将会移除与网格上的某一块石头共享一列或一行的一块石头. 我们最多能执行多少次 move ...
- 重置jenkins用户名密码
忘记用户名密码(如图)不管是忘记用户名密码还是误删jenkins目录下的users文件都可以使用下面的方式找回密码,我的版本是Jenkins 2.134 1. 进入jenkins安装目录,我的 ...
- storm并行
Storm并行度 wordcount 统计job代码 public class WordCountTopology { private static final String SENTENCE_SPO ...
- thinkPHP5如何使用rabbitmq
thinkPHP5如何使用rabbitmq? 安装好 tp5 的 rabbitmq 扩展后,在项目根目录文件添加文件 rabbitmq.php 引导启动 rabbitmq. <?php defi ...
- 25个强大的CSS代码,据说这些是开发者经常遇到比较棘手的代码
这些代码是经常用到的,比方说一些特殊的效果,圆角边框,CSS透明度,梯形环绕,CSS小三角等,希望对你有用 1简单又好的 Blockquote 样式 CSS代码如下 blockquote { back ...