Kafka Producer

一、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实战》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容