背景
我们都知道 kafka 是把消息存储在磁盘上的,那随着消息数量的不断增大,所占用的空间也是不断的增加的,那减少消息的占用空间就是一个优化的方向。kafka也考虑到了这一点,所以就有了消息压缩机制。
原理
消息压缩就是⽤时间去换空间的经典 trade-off 思想,具体来说就是⽤ CPU 时间去换磁盘空间或⽹络 I/O 传输量,希望以较⼩的 CPU 开销带来更少的磁盘占⽤或更少的⽹络 I/O 传输。
消息格式
有两⼤类消息格式,分别称之为V1版本和V2版本。V2版本是Kafka 0.11.0.0中正式引⼊的 V2版本都⽐V1版本节省磁盘空间,当启⽤压缩时,这种节省空间的效果更加明显
配置
配置项
- product端:
spring.kafka.producer.compression-type=gzip
- broker端:
producer.properties
compression.type=none
压缩格式
- LZ4
- Snappy
- zstd
- GZIP
压缩格式比较
- 吞吐量维度
LZ4 > Snappy > zstd / GZIP
- 压缩⽐⽅⾯
zstd > LZ4 > GZIP > Snappy
什么时候触发压缩
在kafka中,⽣产者程序中配置compression.type参数即表示启⽤指定类型的压缩算法

这样 Producer 启动后生产的每个消息都是 GZIP 压缩过的,从而降低了Producer到Broker的网络传输,从而也降低了Broker的数据存储压力。
两种例外情况就可能让Broker重新压缩消息:
- Broker端指定了和Producer端不同的压缩算法
- Broker端发⽣了消息格式转换
什么时候解压缩
有了压缩,那一定有对应的解压缩。在kafka中,producer端进行消息压缩,broker端保持消息压缩,consumer端解压缩。
结束
需要交流学习可以关注公众号【温故知新之java】,互相学习,一起进步。