在 Kafka 中,生产者(Producer)负责将消息发送到 Kafka 集群。生产者的运行流程涉及多个步骤,包括消息的序列化、分区分配、网络传输和确认机制。以下是 Kafka 生产者的详细运行流程:

配置初始化

  • 生产者首先需要配置一系列参数,如 bootstrap.servers(Kafka 集群的初始连接地址)、key.serializervalue.serializer(消息键和值的序列化器)、acks(确认机制)等。

消息创建

  • 应用程序创建消息,指定消息的键(Key)和值(Value)。键用于分区分配,值是实际的消息内容。

序列化

  • 消息的键和值通过配置的序列化器(如 StringSerializerByteArraySerializer 等)进行序列化,转换为字节数组。

分区分配

  • 如果消息指定了键,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,表示消息写入成功。