Kafka解压缩

压缩的目的

时间换空间,用CPU时间去换磁盘空间或网络IO传输量。

配置

// 开启GZIP压缩
// Producer启动后,生产的每个消息集合都会经过GZIP压缩,能够很好地节省网络传输带宽和Kafka Broker端的磁盘占用。

1
2
3
props.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压缩,可以极大地节省网络带宽。

------ 本文结束------

本文标题:Kafka解压缩

文章作者:Perkins

发布时间:2019年11月30日

原始链接:https://perkins4j2.github.io/posts/27626/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。