kafka处理大消息
kafka实现高吞吐主要是顺序写盘、pagecache、网络零拷贝技术特点。在模拟集群性能测试中发现当消息大于10KB时,集群出现吞吐下降及相应的时延问题。也就是说对于kafka来说大消息不能充分发挥高吞吐的特性(批处理)。所以对大消息如何处理呢?以下是个人建议及具体使用过程中配置参数供大家参考。
1. 处理大消息建议
不传送大消息数据,建议使用共享存储相关技术手段(NAS、HDFS、S3、fastdfs等)
要对大消息进行切片或切块,标识生产数据每块小于10KB(注意保证数据各个分片顺序性及落到同一分区中)
压缩消息数据(XML、JSON),对共有特征的数据进行压缩传输,个人建议使用snappy。kafka特点存储时不做解压处理,只在实现consumer时自动解压缩。
2. kafka集群 Broker配置
message.max.bytes(默认:1000000) – broker能接收消息的最大字节数,需< fetch.message.max.bytes(consumer端,否则无法消费)
log.segment.bytes (默认: 1GB) – kafka数据文件的大小,确保这个数值大于一个消息的长度。
replica.fetch.max.bytes (默认: 1MB)应>message.max.bytes ,否则无法复制数据丢失
3. Consumer配置
fetch.message.max.bytes (默认 1MB) – 消费者能读取的最大消息,大于 message.max.bytes
总结:对于大消息可能会对集群及topic带来潜在的影响,需要合理设计内存(JVM)及分区数量。例如:若消息为1MB,集群若有1000分区,则就需要1GB内存。(一定要注意OOM异常)