Kafka中的RPC:Server端代码流程简单概述

kafka版本:

kafka RPC Server端代码入口:kafka.network.SocketServer

流程概述:kafka自己实现了reactor模型,用于IO处理

kafka中,一个Acceptor对应一个不同的端口Endpoint
一个Acceptor中有一组Processor,数量为num.network.threads
Acceptor:
通过NIO方式获取ServerSocketChannel,并进行服务端口bind;
注册OP_ACCEPT,读取SocketChannel放入到Processor的队列kafka.network.Processor#newConnections
Processor:
处理队列kafka.network.Processor#newConnections中的SocketChannel
$localHost:$localPort-$remoteHost:$remotePort-$index
并基于SelectionKey包装出一个KafkaChannel,在注册OP_ACCEPT时,作为attachment,方便后面读取请求数据;
通过selector,获取有数据的SelectionKey,同时获取作为attachment的KafkaChannel,通过org.apache.kafka.common.network.NetworkReceive读取数据
读取请求数据时,先读取长度,再读数据,防止粘包拆包;封装为NetworkReceive,放入到org.apache.kafka.common.network.Selector#stagedReceives
然后把stagedReceives中的请求数据,转移到org.apache.kafka.common.network.Selector#completedReceives
然后处理completedReceives:org.apache.kafka.common.requests.RequestHeader#parse反序列化数据,获取RequestHeader,然后将数据封装为kafka.network.RequestChannel.Request#Request
放入kafka.network.RequestChannel#requestQueue
kafka.server.KafkaRequestHandler线程会消费requestQueue数据,调用kafka.server.KafkaApis#handle进行业务处理:根据请求数据头中apiKey进行模式匹配处理,把响应数据放入kafka.network.RequestChannel#responseQueues
然后处理responseQueues队列中的响应数据,需要发送的,就在对应channel上上注册OP_WRITE;
下一轮org.apache.kafka.common.network.Selector#poll的时候就可以处理OP_WRITE,把待发送的数据Send,通过SocketChannel进行发送,
发送完成后,放入到org.apache.kafka.common.network.Selector#completedSends队列
kafka.network.Processor#processCompletedSends:处理完成的数据:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值