Kafka消息链路

一、消息发送流程

Kafka消息链路_第1张图片

1. 外部数据

2. kafka producer 生产者

  • 在main线程中创建一个生产者,通过send方法发送外部数据

4. Interceptors 拦截器(可选项)

  • Flume对数据进行拦截处理

5. Serializer 序列化器

  • 跨节点通信需要对数据进行序列化
  • 由于Java自带的序列化器Serializable太重,携带了太多不需要的信息,所以使用kafka自带的序列化器

6. DefaultPartitioner 分区器

  • 在未定义分区器时,会使用默认的分区器:根据key的hashcode的整数值除以分区数得出该数据应该发送于哪个分区
  • 如果数据既没有指定分区,也没有指定的key,就会选择黏性分区发送,直到该批次(batch.size)满了

Kafka消息链路_第2张图片

  • 自定义分区器,只需要实现Partition接口,重写partition方法,返回值为数据应该发送的分区号,同时在关联自定义分区器

Kafka消息链路_第3张图片
Kafka消息链路_第4张图片

7. RecordAccumulator 缓冲区

  • 缓冲区在内存中,整个区域大小为32M,缓冲区中有多个Deque队列,每个队列有多个批次,缓冲区有一个内存池,当创建队列时会从内存池分走内存,当消息发送完毕,就会释放内存,归还给内存池
  • 数据经过分区器后,会把数据分成多个分区,在缓冲区中一个分区会创建一个队列Deque
  • 经过分区器的数据发送到缓冲区的指定队列时,是按批次发送的,每一个批次大小为16K
  • 数据到达缓冲区的指定队列后会把同一个topic分区的消息先汇总起来,形成一个batch(真正发往kafka服务器的消息都是以batch为单位的),当batch的容量达到指定的batch.size或者到达指定的linger.ms后就会由sender线程发送至kafka集群的指定主题的指定分区,消息发送完之后,batch不再使用了,就把内存块归还给缓冲区

8. sender线程

  • 从缓冲区的队列里主动拉取数据发送至kafka的对应分区。
  • 拉取数据有两个条件,一个式batch.size,一个是linger.ms,这两者是或的关系,任何一个满足要求都会触发sender线程对数据进行拉取
  • sender线程发送数据时,是以节点为单位进行发送,一个节点broker.id为key,value为该节点的请求进行发送

9. selector

  • 缓冲区和kafka集群之间的“高速公路”,数据通过selector才能从缓冲区发送到kafka集群

10. kafka集群

  • 集群在收到消息后进行副本的同步,同步之后进行应答 ,如果应答成功就清理掉该节点缓存的请求,并清理队列中的批数据
  • 如果失败了就重试,默认的重试的次数是int的最大值,也可以自定义重试次数
  • 在发送请求的时候也在等待kafka节点的应答,如果连续5个请求都没有收到一个应答,就会停止发送
  • 在发送请求时有一个应答机制ack:0、1、-1

你可能感兴趣的:(Kafka,spring,kafka)