Kafka之生产者 笔记二

本文详细介绍了Kafka的客户端和服务端通信流程,包括客户端请求的发送与处理、响应的接收等关键步骤。同时探讨了客户端如何与多个服务端节点交互,以及服务端如何处理客户端请求。还对比了新旧版本生产者的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.一个服务端多个处理器:

最后结语:不推荐细看书籍,第一次看需要抽象整个流程。提升抽象能力。多问几个问什么 要这样设计而不是问该怎么写这个代码。切记!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值