浅谈Kafka消息压缩

概述

Kafka目前支持GZIP、Snappy、LZ4、zstd、不压缩这几种压缩算法。在开启压缩时,Kafka会选择一个batch的消息一起压缩,这样的一批消息就是一个压缩分段,我们也可以通过参数来控制每批消息的大小。

在Kafka中,生产者生成一个压缩分段发给broker,在broker中是不会解压这个压缩分段的(因为在Kafka中一个batch的消息在broker中是不会拆分的,自然也不会进行解压),最后压缩分段由消费者进行解压。

Kafka通过这种设计,降低了broker中CPU资源的消耗,同时还能获得压缩后「占用传输带宽小,占用存储空间小」等好处,是非常值得我们借鉴和学习的。

一个坑点

我们平常在讨论Kafka压缩的时候一般只考虑生产者这一侧的压缩。实际上,在broker中如果触发了某些条件也是会进行解压和压缩操作的!反映到系统层面就会看到broker端CPU使用率飙升。

有两种触发条件:

  1. broker端指定了和生产者端不同的压缩算法。
  2. broker端发生了消息格式(V2 → V1,兼容老版本)转换,同时这种操作也会使Kafka丧失零拷贝的优势,进一步损失性能。这启发我们在生产环境中要尽量保证消息格式的统一

在什么时候适合启用Kafka压缩功能

  • 客户端(生产者、消费者)CPU资源充足。压缩毕竟是一种「时间换空间」的策略,如果能用系统长板来弥补短板的话那自然再好不过了。
  • 带宽资源有限。目前带宽也是一种稀缺资源,尤其是对高吞吐的MQ而言,如果系统带宽成为瓶颈的话可以考虑开始消息压缩功能。→ 如果客户端机器 CPU 资源有很多富余,强烈建议开启 zstd 压缩,这样能极大地节省网络资源消耗。

几种压缩算法的性能对比

这张表是 Facebook Zstandard 官网提供的一份压缩算法 benchmark 比较结果:
https://raw.githubusercontent.com/Joker-5/image-host/master/img/20220521194607.png
可以看出:

  • 吞吐量方面:LZ4 > Snappy > zstd 和 GZIP
  • 压缩比(压缩前大小/压缩后大小)方面:zstd > LZ4 > GZIP > Snappy
  • 具体到物理资源,Snappy占用的网络带宽最多,zstd 最少。在 CPU 使用率方面,各个算法表现得差不多,只是在压缩时 Snappy 算法使用的 CPU 较多一些,而在解压缩时 GZIP 算法则可能使用更多的 CPU。

参考自胡夕老师《Kafka核心技术与实战》极客时间专栏,老师的课很棒,强烈推荐!

### 如何配置Kafka消息压缩 #### Broker级别配置 对于broker级别的消息压缩配置,可以通过`configs`命令来调整`compression.type`配置项。此配置决定了未指定主题级压缩类型的生产者所发送消息的默认压缩方式[^2]。 如果使用的Kafka版本是在1.1.0及以上,则更改此类配置不需要重启broker即可生效,因为`compression.type`被分类为cluster-wide参数,这意味着它是一个可以动态更新而不必重启服务就能起作用的选项。 为了实现这一点,在服务器属性文件(`server.properties`)中加入如下所示的一行代码: ```properties compression.type=lz4 ``` 这会设定LZ4作为整个集群内所有新创建topic的默认压缩方法,除非特定的主题另有定义[^4]。 #### Topic级别配置 除了全局性的broker设置外,还可以针对单独的话题(topic)定制化其压缩行为。当希望某个具体话题下的记录采用不同于其他地方的方式进行打包,便需要用到这种方式。通过创建或修改已有话题的候指明所需的压缩模式完成这项工作。例如,利用Kafka自带工具执行下面这样的指令就可以做到这点: ```bash kafka-topics.sh --alter --bootstrap-server localhost:9092 --topic my_topic_name --config compression.type=gzip ``` 上述命令将会把名为`my_topic_name`的话题配置成使用GZIP算法来进行数据压缩。 #### 生产者客户端配置 另外值得注意的是,虽然前面提到的方法能够控制大部分情况下产生的流量如何被压缩,但是最终还是允许各个独立的应用程序在其连接到Kafka自行决定是否启用以及选用哪种具体的压缩方案。这是因为在生产者的API层面也提供了相应的配置键——同样叫做`compression.type`,它可以覆盖掉更上层设定好的值。因此开发者可以根据实际情况灵活选择最合适的策略[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值