04、Kafka 实战 - 生产者:发送消息的组件

生产者和消费者客户端与服务端完成一次网络请求通信的具体步骤

  • 生产者客户端应用程序产生消息
  • 客户端连接对象将消息包装到请求中,发送给服务端
  • 服务端连接对象负责接收请求,并将消息以文件形式存储
  • 服务端返回响应结果给生产者客户端
  • 消费者客户端应用程序消费消息
  • 客户端连接对象将消息信息也包装到请求中,发送给服务端
  • 服务端从文件存储系统中取出消息
  • 服务端返回响应结果给消费者客户端
  • 客户端将响应结果还原成消息,并开始处理消息

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

涉及组件

  • KafkaProducer 生产者客户端对象
  • Kafka 的记录收集器 RecordAccumulator,负责缓存生产者发送来的消息
  • Kafka 发送线程 Sender,负责读取 RecordAccumulator 的批量消息,通过网络发送给服务端 Kafka 选择器
  • Selector 负责处理网络连接和读写处理,使用 NetworkClient 处理客户端网络请求

组件简介

  • KafkaProducer

  • 将记录发布到 Kafka 集群的 Kafka 客户端,生产者是线程安全的

  • 主要涉及 ack 解析(parseAcks)、异步发送(doSend)、计算分区(partition)等

  • RecordAccumulator

  • 这个类充当一个队列,将要发送到服务器的实例记录累积到 MemoryRecords 中,累加器使用有限的内存,当内存耗尽时,追加调用将阻塞,除非被禁用

  • 主要涉及批次大小计算和封装(append)、数据读取(ready)等

  • Sender

  • 处理向 Kafka 集群发送生产请求的后台线程。该线程发出元数据请求以更新其集群视图,然后向适当的节点发送生成请求

  • 等待其他线程唤醒来执行发送请求

  • Selector

  • 用于进行非阻塞多连接网络 I/O 的 nioSelector 接口

  • 这个 Selector 是 kafka 自己基于 Java NIO 封装的一个 Selector,线程不安全

  • 主要涉及网络连接(connect)、通道注册(register)、存放请求(send)等

  • NetworkClient

  • 用于异步 请求/响应 网络 I/O 的网络客户端

  • 这是一个内部类,用于实现面向用户的生产者和消费者客户端,线程不安全

生产者发送消息代码在下一篇中详细解析