陪你一起学kafka(十)——消息压缩

475 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

背景

我们都知道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参数即表示启⽤指定类型的压缩算法

image.png 这样 Producer 启动后生产的每个消息都是 GZIP 压缩过的,从而降低了Producer到Broker的网络传输,从而也降低了Broker的数据存储压力。

两种例外情况就可能让Broker重新压缩消息:

  1. Broker端指定了和Producer端不同的压缩算法
  2. Broker端发⽣了消息格式转换

什么时候解压缩

有了压缩,那一定有对应的解压缩。在kafka中,producer端进行消息压缩,broker端保持消息压缩,consumer端解压缩,