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