我司使用kafka版本为1.1.0,主要有两个使用场景:其一,消息通信;其二,与spark streaming集成使用。本文用来记录笔者对kafka producer的使用、理解。
Producer主要工作过程
1、 将消息包装成ProducerRecord对象
2、 对ProducerRecord对象进行序列化
3、 Interceptor(该步骤暂时没有使用场景)
4、 通过partitioner,选择producerrecord发往的分区
5、 准备发往kafka broker
6、 等待broker的响应
Producer主要参数
配置项 | 说明 |
---|---|
Buffer.memory | 默认32m |
Buffer.size | 默认16k |
Linger.ms | 默认0 |
Acks | 默认值1 |
Compression.type | 默认值none |
Max.request.size | 默认1M |
Max.block.ms | 默认60s |
- Buffer.memory,用来指定Kafka Producer实例使用的缓存空间大小。
- Buffer.size和linger.ms,这两个参数决定何时真正把message发送到kafka broker。当内存中存在的message条数超过buffer.size,或者延迟了linger.ms,便会将缓冲空间中的消息发出去。
- Acks,消息发出去,broker何时会返回一个发送成功的响应。默认值为1,即只需要该topic partition 的leader收到该消息,并持久化成功即可。我司一般都使用该默认值。
- Compression.type,对消息进行压缩,可以减少网络传输消耗,但是会增加cpu的消耗。另外如何此处设置的compression.type和broker server.properties中配置的压缩方式不一样,那broker会先进行解压缩,再用server端配置的压缩方式再次压缩。
- Max.request.size,限制单条消息的最大值
- Max.block.ms,当buffer.memory已满(即producer往缓存发送的速度已经远大于往broker发送线程的速度),会让发送线程阻塞一段时间,该时间就由此参数决定,默认60s。
其它
平时使用时,Message内容全部放在value部分,key为null,so,producer使用轮询方式去发送消息。
虽然Kafka producer是线程安全的;但在多线程情况下,我还是采用一个线程一个Producer的方式。