生产者和消费者客户端与服务端完成一次网络请求通信的具体步骤
- 生产者客户端应用程序产生消息
- 客户端连接对象将消息包装到请求中,发送给服务端
- 服务端连接对象负责接收请求,并将消息以文件形式存储
- 服务端返回响应结果给生产者客户端
- 消费者客户端应用程序消费消息
- 客户端连接对象将消息信息也包装到请求中,发送给服务端
- 服务端从文件存储系统中取出消息
- 服务端返回响应结果给消费者客户端
- 客户端将响应结果还原成消息,并开始处理消息
生产者发送消息并不是直接发给服务端,而是先在客户端把消息放入队列里面,然后由一个消息发送线程从队列中拉取消息,以批量的方式发送消息给服务端
涉及组件
- 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 的网络客户端
-
这是一个内部类,用于实现面向用户的生产者和消费者客户端,线程不安全
生产者发送消息代码在下一篇中详细解析