栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Kafka架构设计和源码-额外问题记录

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Kafka架构设计和源码-额外问题记录

问题

粘包拆包Kafka如何解决
	先读取前4字节,转换为一个int,即长度
	根据长度申请内存buffer
	最后读取指定大小的数据到申请好的buffer中
生产者如何处理响应消息
	收到成功的响应,则回收内存
	如果有异常则回调函数通知用户,用户自定义业务逻辑处理
消息发送完后内存如何处理
	见前文内存池回收内存处理
消息发送超时条件
	超时时间默认30s
如何处理长时间没有收到响应的消息
	broker节点标记为disconnect,kafka自己封装失联响应结果,
	如果可重试则重新把发送失败的批次放入发送批次,否之将异常传给回调函数并回收内存资源
Processor线程
	在服务端启动的时候,创建并启动了Acceptor线程和Processor线程,每个Acceptor默认管理3个Processor线程对象。
	Acceptor线程的主要工作:接收客户端连接请求,创建对应的SocketChannel并轮询交给Processor线程处理。

Kafka 网络通讯

这里截取取自外部 https://www.modb.pro/u/312924 的文章
网络通讯流程
1 Acceptor接收客户端发来的请求
2 轮询分发给Processor线程处理
3 Processor将请求封装成Request对象,放到RequestQueue队列
4 KafkaRequestHandlerPool分配工作线程,处理RequestQueue中的请求
5 KafkaRequestHandler线程处理完请求后,将响应Response返回给Processor线程
6 Processor线程将响应返回给客户端

对照主从Reactor多线程模型:这里的Acceptor就相当于MainReactor,通过Selector用来接收连接请求,然后创建对应的SocketChannel,
交给某个Processor处理。而Processor就相当于SubReactor,真正建立网络连接,并注册OP_READ事件来读取数据。
KafkaRequestHandlerPool就是线程池对象,而KafkaRequestHandler是真正处理I/O请求操作的工作线程。

Kafka默认1个Acceptor线程对应3个Processor(由num.network.threads参数决定)线程.
而1个KafkaRequestHandlerPool线程池中包含8个KafkaRequestHandler工作线程。(由num.io.thread参数决定)
在Kafka安装目录/config/server.properties配置文件中,就可以看到这两个参数的默认值

Acceptor流程
1 Acceptor线程是在服务端程序启动的时候创建和启动的
2 每个Acceptor线程默认管理了3个Processor线程对象
Acceptor线程通过selector接收客户端的连接事件
一旦有连接事件发生,就创建一个SocketChannel对象
通过轮询的方式,将创建的SocketChannel对象分配给自己管理的Processor线程
每个Processor线程有一个保存SocketChannel的阻塞队列newConnections,该队列的容量为固定的20

综上,Acceptor线程做的事比较简单:接收客户端连接请求,创建对应的SocketChannel并轮询交给Processor线程处理

总结

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/985574.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号