一、producer特点
- 发送过程涉及两个线程:用户主线程和sender I/O线程。
- 异步发送消息,提供回调机制(callback)用于判断是否发送成功,可以做消息重发,提高消息可靠性。
- 分批机制(batching),每批次包含多个发送请求,提升吞吐量。
- 合理的分区策略:对于没有指定key的消息,旧版producer分区策略是一段时间内的消息发送到固定分区,容易造成数据倾斜(skewed);新版采用轮询方式,消息更加均匀。
- 底层统一使用基于java selector的网络客户端,结合java的future实现健壮而优雅的生命周期管理。
二、producer工作流程
首先创建待发送的消息对象ProducerRecord,然后调用KafkaProducer#send方法进行发送。
KafkaProducer接收到消息后首先对其序列化,然后结合本地缓存的元数据信息一起发送给partitioner确定目标分区,最后追加写入内存中的消息缓冲池(accumulator)。KafkaProducer的Sender I/O线程将缓冲池中的消息分批次通过socket发送给对应的broker,完成消息发送逻辑。
- 第一步:序列化+计算目标分区。
- 第二步: 追加写入消息缓冲区(accumulator)。
- 第三步:sender线程预处理及消息发送。
- 第四步:sender线程处理response,回调方法。
三、消息分区、消息序列化
默认partitioner会根据mumur2算法计算消息key的哈希值,然后对总分区数取模,得到消息要被发送到的目标分区号。如果消息没有key,则会用轮询的方式确保消息在topic的所有分区上均匀分配。
可以自定义消息序列化。
四、producer拦截器
producer拦截器用于客户端的定制化控制逻辑。interceptor使得用户在消息发送前(用户主线程中)以及producer回调逻辑(I/O发送线程)前对消息做定制化需求。producer运行指定顺序的多个interceptor从而组成拦截链。
interceptor可能运行在多个线程的事实,因此需要自行确保线程安全。
参考
《Apache Kafka实战》