kafka之生产者

一、通讯过程

   生产者、消费者看作客户端,消息代理看作服务端,它们之间的网络通讯如下:

二、概念

1、生产者发送过程:生产者要发送消息,并不是直接发送给服务端,而是先在客户端把消息放入队列中, 然后由一个消息发送线程从队列中拉取消息,以批盐的方式发送消息给服务端。

2、记录收集器(RecordAccumulator):负责缓存生产者客户端产生的消息(批记录队列),批记录没有满,需要等待直到收集足够的信息。这里需要判断队列中的批记录是否满,没有满继续追加;满则需要开通新的批记录。

追加消息到记录收集器的过程

发送线程发送给服务端过程

3、发送线程(Sender):负责读取记录收集器的批量消息, 通过网络发送给服务端。有两种发送方式:按照分区直接发送、按照分区的目标节点发迭。

4、客户端网络连接对象(NetworkClient):管理了客户端和服务端之间的网络通信,包括连接的建立、发送客户端请求、读取客户端响应。连接对象方法:

限制条件:针对同一个服务端,如果上一个客户端请求还没有发送完成,则不允许发送新的客户端请求。

客户端是否需要响应结果的两种场景:

   (1)、不需要响应的流程。开始发送请求→添加客户端请求到队列→发送请求→请求发送成功→从队列中删除发送请求→构造客户端响应。

  (2)、需要晌应的流程。开始发送请求→添加客户端请求到队列→发送请求→请求发送成功→等待接收响应→接收响应→接收到完整的响应→从队列中删除客户端请求→构造客户端响应。

客户端请求和客户端响应的流程关系

5、选择器(Selector): 处理网络连接和读写处理,使用网络连接(NetworkClient)处理客户端网络请求,保证客户端网络请求的快速响应。使用JavaNIO异步非阻塞方式管理连接和读写请求,它用单个线程就可以管理多个网络连接通道。使用选择器的好处是:生产者客户端只需要使用一个选择器,就可以同时和Kafka集群的多个服务端进行网络通信。

NIO概念

SocketChannel 、选择键、传输层、Kafka通道的关系为: SocketChannel注册到选择器上返回选择键,将选择器用于构造传输层,再把传输层用于构造Kafka通道。

kafka通道写入过程

kafka通道读取过程

选择器的轮询

客户端建立连接到服务端接受连接步骤

客户端和服务端的事件都是对应的,客户端连接OP_CONNECT 对应服务端接受OP_ACCEPT ,客户端写入OP_WRITE 对应服务端读取OP_R E AD ,服务端写入OP _WRITE对应客户端读取OP_READ。

客户端和服务端的选择器步骤

6、异步发送模式:提供一个回调,调用send后可以继续发送消息而不用等待。当有结果运回时,会向动执行回调函数。异步发送指的是生产者发送完一条消息后,不需要关心服务端处理完了没有,可以接着发送下一条消息。即是返回响应结果就调用回调类的回调方法(onCompletion)。

7、同步模式:调用send 返回Future 时, 需要立即调用get ,因为Future.get 在没有返回结果时会一直阻塞。

     注意:(1)、发送消息时没有没有键key,采用round-robin方式,均衡地发到不同的分区。

                 ( 2)、消息有键,则对键进行散列化后,再与分区的数量取模运算得到分区编号。

8、PartitionInfo对象:表示一个分区的分布信息,它的成员变量有主题名称、分区编号、所在的主副本节点、所有的副本、ISR列表。消息集选择主副本过程:消息选择分区编号,根据编号选择主副本,提高写入性能。如下图:

9、SocketServer:主要关注网络层的通信协议,具体的业务处理逻辑则交给

KafkaRequestHandler和KafkaApis来完成。具体实现的步骤如下:

10、Reactor模式:用一个接收器线程负责接收所有的客户端连接请求,并将接收到的请求分发给不同的处理器处理。设计思想:将连接部分和请求部分用不同的线程来处理,这样请求的处理不会阻塞不断到来的连接。

11、请求通道的请求队列和晌应队列请求通道就是处理器与请求处理线程和KafkaApis 交换数据的地方:如果处理器往请求通道添加请求,请求处理线程和KafkaApis 都可以获取到请求通道中的请求;如果请求处理线程和KafkaApis 往请求通道添加响应,处理器也可以从请求通道获取晌应。关于请求和响应的接收和发送是有顺序的: 发送请求→接收请求→发送n向应→接收响应。

 Kafka技术内幕:图文详解Kafka源码设计与实现.郑奇煌.pdf 的学习笔记

猜你喜欢

转载自blog.csdn.net/baidu_28068985/article/details/106164388