
我的新课《C2C 电商系统微服务架构120天实战训练营》在公众号儒猿技术窝上线了,感兴趣的同学,可以长按扫描下方二维码了解课程详情:
课程大纲请参见文末

本文来源:yes的练级攻略
叨叨
Kafka源码呢?
go,然后想用go写个消息队列,在画架构图的时候就来问我,这消息队列好像有点东西啊,消息收发,元数据管理,消息如何持久一堆问题过来,我直呼顶不住。
Kafka、
RocketMQ都是现成的方案,于是乎我就看起了源码。所以促使我看源码的初始动力,竟然是为了在同事前面装逼!!
RocketMQ,因为毕竟是
Java写的,而
Kafka Broker都是
scala写的。
RocketMQ之后,我又想看看
Kafka是怎么做的,于是乎我又看起了
Kafka。
Kafka底层的通信模型。应对面试官询问
Kafka请求全过程已经够了。
Reactor模式
Kafka之前我们先来说说
Reactor模式,基本上只要是底层的高性能网络通信就离不开
Reactor模式。像Netty、Redis都是使用
Reactor模式。

Reactor。

C10K了。
IO多路复用,由一个线程来监视一堆连接,同步等待一个或多个IO事件的到来,然后将事件分发给对应的
Handler处理,这就叫
Reactor模式。
单线程 => 多线程 => 线程池 => Reactor模型
Kafka所采用的Reactor模型
如下
Kafka Broker 网络通信模型
Acceptor(mainReactor)监听新连接的到来,与新连接建连之后轮询选择一个
Processor(subReactor)管理这个连接。
Processor会监听其管理的连接,当事件到达之后,读取封装成
Request,并将
Request放入共享请求队列中。
Processor的响应队列中,然后由
Processor将
Response返还给客户端。
listener只有一个
Acceptor线程,因为它只是作为新连接建连再分发,没有过多的逻辑,很轻量,一个足矣。
Processor在Kafka中称之为网络线程,默认网络线程池有3个线程,对应的参数是
num.network.threads。并且可以根据实际的业务动态增减。
KafkaRequestHandlerPool,执行真正的处理,对应的参数是
num.io.threads,默认值是 8。IO线程处理完之后会将
Response放入对应的
Processor中,由
Processor将响应返还给客户端。

源码级别剖析网络通信模型
SocketServer

SocketServer旗下管理着,
Acceptor 线程、
Processor 线程和
RequestChannel等对象。
data-plane和
control-plane稍后再做分析,先看看
RequestChannel是什么。
RequestChannel

Processor和作为传输
Request和
Response的中转站。
Acceptor
Acceptor
AbstractServerThread,接下来再看看它run些啥

accept(key)做了啥

selector的处理,获取准备就绪事件,调用
serverSocketChannel.accept()得到
socketChannel,将
socketChannel交给通过轮询选择出来的
Processor,之后由它来处理IO事件。
Processor
Processor,相对而言比
Acceptor复杂一些。


Processor主要是将底层读事件IO数据封装成
Request存入队列中,然后将IO线程塞入的
Response,返还给客户端,并处理
Response的回调逻辑。
KafkaRequestHandlerPool


requestChannel拿请求,然后调用handle处理请求。
handle方法是位于
KafkaApis类中,可以理解为通过
switch,根据请求头里面不同的
apikey调用不同的
handle来处理请求。

LIST_OFFSETS的过程,即
handleListOffsetRequest,来完成一个请求的闭环。
Processor的。


请求处理优先级
data-plane和
control-plane是时候揭开面纱了。这两个对应的就是数据类请求和控制类请求。
Preferred Leader选举时候,
producer将
ack设置为
all时候,
老leader还在等着
follower写完数据向他报告呢,谁知
follower已经成为了
新leader。
老leader就傻傻的在等着,直到超时。
Listener,即数据类型一个
listener,控制类一个
listener。
Porcessor线程,并且请求队列写死的长度为20,社区觉得这样够了。
课程大纲




文章转载自石杉的架构笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。





