消息队列-消息压缩

290 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情

前言

在生产者端和消费者端都进行过性能优化的情况下,要从消息队列端进行考虑优化,有一个方案在通常情况下,可以使消息队列的数据吞吐量增大10-20倍,这就是使用数据压缩。

什么情况适用

首先了解压缩算法,这个本质是一个耗费CPU资源的事情,达到的目的是提升网络传输以及压缩数据提升传输效率。在此前提下,那说明只有在网络IO资源紧张以及传输数据量庞大、但是CPU资源相对较空闲的场景下比较适用于此方案。

压缩算法

压缩算法基本上可以分为两种:有损压缩和无损压缩。

有损压缩一般都是用来压缩音频和视频之类的,因为它经过数据压缩之后是会丢失信息的。

反之,无损压缩,在经过数据压缩和数据解压后,数据都不会丢失,解压后的数据与压缩前端的数据是百分比一致的。

目前常见的压缩算法包括:ZIP、GZIP、LZ4 等,压缩算法的详细原理以及从哪些方面考虑如何选择需单独了解。

Kafka的消息压缩

Kafka 本身是支持消息压缩的,可以通过配置来开启,并且Kafka支持多种压缩算法,在开启时可以由用户自定义选择使用哪一种压缩算法。

Kafka 一般是对一批消息进行一次压缩,这一个批消息就是一个压缩分段,用户可以通过配置参数来修改这个消息批次的大小,控制压缩的数据量。

在Kafka 中,生产者发送一批次压缩过的数据到消息队列,消息队列直接存储,不对消息做拆分解压处理,待消费者拉取消息时,也原样将压缩数据发送给消费者,具体的解压由消费者自行完成,这样实现的好处是消息的压缩和解压都不用在消息队列中完成,因为这两项操作也是最耗时和耗费CPU资源的,可以不对消息队列的高性能产生影响。