压缩的目的
时间换空间,用CPU时间去换磁盘空间或网络IO传输量。
配置
// 开启GZIP压缩
// Producer启动后,生产的每个消息集合都会经过GZIP压缩,能够很好地节省网络传输带宽和Kafka Broker端的磁盘占用。1
2
3props.put("compression.type", "gzip");
Producer<String, String> producer = new KafkaProducer<>(props);
Consumer
通常来说解压缩发生在消费者
Producer压缩,Broker保持、Consumer解压缩
Kafka会将启用的压缩算法封装进消息集合中,当Consumer读取到消息集合时,会知道这些消息使用了哪一种压缩算法。
Broker
与消息格式转换时发生的解压缩是不同的场景(主要为了兼容老版本的消费者)。
每个压缩过的消息集合在Broker端写入时都要发生解压缩操作,目的是为了对消息执行各种验证(主要影响CPU使用率)。
压缩算法对比
Kafka 2.1.0之前,Kafka支持三种压缩算法:GZIP、Snappy、LZ4,从2.1.0开始正式支持zstd算法。
- zstd是Facebook开源的压缩算法,能够提供超高的压缩比
评估一个压缩算法的优劣,主要有两个指标:压缩比、压缩/解压缩吞吐量。
zstd具有最高的压缩比,LZ4具有最高的吞吐量
在Kafka的实际使用中
- 吞吐量:LZ4 > Snappy > zstd > GZIP
- 压缩比:zstd > LZ4 > GZIP > Snappy
- 带宽:由于Snappy的压缩比最低,因此占用的网络带宽最大
- CPU:各个压缩算法差不多,在压缩时Snappy使用更多的CPU,在解压缩时GZIP使用更多的CPU
带宽资源比CPU资源和磁盘资源更吃紧(千兆网络是标配),首先排除Snappy,其次排除GZIP,剩下在LZ4和zstd中选择。
如果客户端的CPU资源充足,强烈建议开启zstd压缩,可以极大地节省网络带宽。