摘要:Kafka 网络模块之 Server 端,介绍 Server 端启动、接管申请和解决申请的过程。
本文分享自华为云社区《Kafka 网络模块 -Server 端》,原文作者:中间件小哥。
SocketServer 是 Kafka server 端用于解决申请的模块,在 Kafka 启动过程创立、初始化、启动。
SocketServer 启动过程:
- 依照 endpoint 程序初始化 Acceptor,每个 endpoint 对应一个 Acceptor,为每个 Acceptor 创立 Processor(数量由 num.network.threads 配置项决定),并启动 Acceptor,Acceptor 启动后会通过 selector 监听连贯,并将新建设的连贯交给 Processor 解决(轮询抉择 Processor)
- 启动所有 Processor
Acceptor 启动、监听连贯过程: - Acceptor 启动后,会创立一个 serverSocketChannel,监听在该 acceptor 对应的 endpoint 上,并在 selector 上注册 OP_ACCEPT,而后进入死循环,每次循环,通过 selector 获取就绪的 key(即后面注册的 serverSocketChannel),表明有连贯来到,而后通过 accept() 创立一个和该连贯对应的 socketChannel,而后从该 acceptor 负责的 processors 中轮询抉择一个,将该 socketChannel 交给抉择的 processor 解决,行将连贯交给 processor。
- Acceptor 将连贯交给 processor 解决,是将 socketChannel 退出 processor 的连贯队列 newConnection 中,processor 在 run 办法中会一直地从中获取并解决。
- Processor 从 newConnection 获取到 socketChannel 后,在 selector 上注册 OP_READ,并创立对应的 KafkaChannel。
Server 端接管申请、解决的过程:
- Processor 收到 OP_READ 的事件就绪后,查看并尝试实现 SSL 握手和 SASL 校验(此时不肯定握手实现,所以在 Processor 收到 OP_READ 的事件就绪后,要先查看并确保握手曾经实现,SSL/SASL 相干参考 9.4 节)
- SSL 握手和 SASL 校验实现后,从 channel 中读取数据,结构 NetworkReceive 对象,并入队 stagedReceives
- 取出 stagedReceives 队首元素(移除),退出 completedReceives
- 将 completedReceives 中的元素取出(不移除),结构 Request 对象,退出 requestQueue,移除对 OP_READ 的事件注册,并将对应的 KafkaChannel 置为 MUTED,再置为 MUTED_AND_RESPONSE_PENDING
- KafkaRequestHandler 从 requestQueue 取出元素(移除),并交给 KafkaApi 模块解决申请
- KafkaApi 解决完申请后,将响应放入对应的 processor 的 responseQueue 和 inflightResponses 中,并唤醒其 selector
- Processor 从 responseQueue 中取出响应(移除),若响应是须要发回给客户端的,则将响应的 send 赋值给 KafkaChannel,并注册 OP_WRITE 事件
- 当 channel 写就绪后,将 send 写入 channel 的写 buffer,当 send 写完后,移除对 OP_WRITE 事件的注册,并将 send 退出 completedSends
- 从 inflightResponses 中移除对应的响应,执行响应回调,将 KafkaChannel 置为 MUTED,再从 MUTED 置为 NOT_MUTED,并从新增加 OP_READ 事件注册
点击关注,第一工夫理解华为云陈腐技术~