1.客户端请求分为响应式的请求和非响应式的请求:
不需要响应的流程:
开始发送请求->添加客户端请求到队列->发送请求->请求发送成功->从队列中删除请求->构造客户端响应。
需要响应的流程:
开始发送请求->添加客户端请求到队列->发送请求->请求发送成功->等待接收响应->接收响应->接收到完整的响应->从队列中删除客户端的请求->构造客户端的响应。
2.请求与响应流程描述:
1.发送线程创建的客户端请求对象包括请求本身和回调函数。
2.发送线程将客户端请求交给NetworkClient,并记录目标节点到客户端请求的映射关系。
3.NetworkClient的轮询得到发送请求,将客户端请求发送到对应的服务端目标节点。
4.服务端处理客户端请求,将客户端响应通过服务端的请求通道返回给客户端。
5.NetworkClinet 的轮询得到响应结果,说明客户端收到服务端发送过来的请求处理结果。
6.客户端发送请求时发送到了不同节点,收到的结果也可能来自不同节点。服务端发送过来的响应结果都表示了它从哪里来,客户端根据NetworkReceive的Source查找步骤(2)记录的信息,得到对应的客户端请求,把客户端请求作为客户端响应的成员变量。
7.调用ClientRespose.ClientRequest.Callback.onComplete(),触发回调函数的调用。
8.客户端请求中的回调对象会使用客户端的响应结果,来调用生产者应用程序自定义的回调函数。
9!!!!!!!选择器处理网络请求。从数据消息记录器->给个分区号->写到分区->分区批记录->队里满了->消息收集器batches->发送线程->网络连接线程
10.客户端操作kafka通道,都需要通过选择器。选择器监听客户端的读写事件,会获取绑定到选择键上的Kafka通道。然后Kafka通道交给传输层,传输层再使用底层的SocketChannel传输。
11,kafka通道一次只能处理一个send请求,每次send都要添加写事件。当send发送成功后,就要取消写事件。kafka是事件驱动的,如果没有请求,就不需要监听写事件,kafka通道就不需要写操作。发送请求和对应事件监听步骤:设置send请求到kafka通道->注册写事件->发送请求->send请求发送完成->取消写事件 。
12.Kafka写入通道流程:
12.1 发送请求时,通过kafka通道设置要发送的请求对象,并注册写事件。
12.2客户端轮询到写事件,会取出Kafka通道中的发送请求,并发送给网络通道。
12.3 如果本次写操作没有全部完成,那么由于写事件仍然存在,客户端还会再次轮询到写事件。
12.4 客户端新的轮询会继续发送请求,如果发送完成,则取消写事件,并设置返回结果。
12.5 请求发送完成后,加入到completedSends集合中,这个数据会被调用者使用。
12.6 请求已经全部发送完成,重置send对象为空,下一次新的请求才可以继续正常进行。
13.kafka通道的读取
14.选择器轮询:
15.主要组件:
16.新旧版本生产者不同:
旧的版本主要用了阻塞队列,而新的版本用了记录收集器、队列这些负责的数据结构。
旧版本没有连接器,只能在客户端维持每个目标节点的连接。生产连接池中保存了BrokerID和到一个生产者连接网络连接对象的关系。
17!!服务端网络连接
Kafka Server和网络层的组件包括SocketServer、KafkaApis、KafkaRequestHandlerPool。后两者使用了SocketServer暴露出来的请求通道来处理网络请求。
18.网络层实现:
19.服务端接受客户端连接采用了Reactor模式,将接受到的请求分发到不同的处理器。因此服务端要接收多个客户端的连接请求。模式的设计思想:实际上是将连接部分和请求部分采用不同的线程来处理。这样的请求处理不会阻塞不断到来的连接。
20.客户端建立连接到服务端步骤如下:
21.RequestChanel,在KafkaServer中,会将SocketServer的请求通道传给Kafka请求处理线程和KafkaApis。请求通道就是处理器与请求处理线程和KafkaApis交换数据的地方。如果处理器往请求通道添加线程,请求线程和KafkaApis都可以获取请求通道中的请求;如果请求处理线程和kafkaApis往请求通道中添加响应,处理器也可以从通道中获取响应。
22.
23.一个服务端多个处理器:
最后结语:不推荐细看书籍,第一次看需要抽象整个流程。提升抽象能力。多问几个问什么 要这样设计而不是问该怎么写这个代码。切记!!!