在 Kafka 中,生产者(Producer)负责将消息发送到 Kafka 集群。生产者的运行流程涉及多个步骤,包括消息的序列化、分区分配、网络传输和确认机制。以下是 Kafka 生产者的详细运行流程:
配置初始化
- 生产者首先需要配置一系列参数,如
bootstrap.servers(Kafka 集群的初始连接地址)、key.serializer和value.serializer(消息键和值的序列化器)、acks(确认机制)等。
消息创建
- 应用程序创建消息,指定消息的键(Key)和值(Value)。键用于分区分配,值是实际的消息内容。
序列化
- 消息的键和值通过配置的序列化器(如
StringSerializer、ByteArraySerializer等)进行序列化,转换为字节数组。
分区分配
- 如果消息指定了键,Kafka 会使用键的哈希值来决定消息应该发送到哪个分区。如果没有指定键,则使用轮询(Round-robin)策略来均匀分配消息。
消息缓冲
- 生产者将消息放入缓冲区(Buffer),等待发送。缓冲区的大小由
buffer.memory参数控制。默认 16KB。
消息发送
- 生产者将缓冲区中的消息批量发送给 Kafka Broker。批量发送可以提高网络传输效率。
- 发送时,生产者会根据配置的
retries参数决定重试次数,以应对网络波动或 Broker 临时不可用的情况。
网络传输
- 生产者通过网络将消息发送到指定的 Broker 和分区。
Broker 处理
- Broker 接收到消息后,将其写入对应分区的日志段(Log Segment),并根据配置的
acks参数决定何时返回确认。
确认机制
- 根据
acks配置,Broker 会返回确认信息给生产者:acks=0:生产者不等待确认,直接发送下一批消息。acks=1:生产者等待 Leader 副本写入成功后返回确认。acks=all:生产者等待所有 ISR(In-Sync Replicas)副本写入成功后返回确认。
回调处理
- 生产者可以配置回调函数,在消息发送成功或失败时执行相应的处理逻辑。
记录元数据
- 生产者记录发送消息的元数据,如偏移量、分区信息等,供后续查询和监控使用。
1,Producer 生产消息 ⇒ 2,从 Zookeeper 找到 Partition 的 Leader ⇒ 3,推送消息 ⇒ 4,通过 ISR 列表通知给 Follower ⇒ 5, Follower 从 Leader 拉取消息,并发送 ack ⇒ 6,Leader 收到所有副本的 ack,更新 Offset,并向 Producer 发送 ack,表示消息写入成功。