1 数据压缩意义
Kafka使用数据压缩,最高可提升约几十倍吞吐量。数据压缩不仅可节省存储空间,还可用于提升网络传输性能。这种使用压缩提升系统性能的方法,不仅在MQ使用,日常开发也可。比如传输大量数据或要在磁盘、数据库中存储较大数据,这些情况下,都可考虑使用数据压缩提升性能,还能节省网络带宽和存储空间。
2 数据压缩适用场景
进程间通过网络传输数据是不是需要压缩?
- 不压缩直接传输耗时: 传输未压缩数据的耗时
- 使用数据压缩耗时: 压缩耗时 + 传输压缩数据耗时 + 解压耗时
压缩快还是不压缩快呢?
不好说。影响因素多,比如数据压缩率、网络带宽、收发两端服务器的繁忙度。
压缩和解压的操作都是计算密集型操作。如果你的应用处理业务逻辑就需耗费大量CPU资源,就不太适合再压缩解压。
若系统瓶颈是磁盘IO性能,CPU资源又闲,这就非常适合在把数据写入磁盘前先压缩。
但若系统读写比严重失调,要考虑每读次数据就解压次是不是划算。
压缩的本质是资源置换,即时间换空间或CPU资源换存储资源。
就像木桶理论,每个系统都有性能瓶颈资源,可能磁盘IO、网络带宽、CPU。
若使用压缩,能用长板来换些短板,那总体上就能提升性能,这就划算。
若用压缩后,短板更短,就不划算。
只有通过性能测试,确认数据压缩可提升系统性能,就需选择合适压缩算法了。
3 压缩算法抉择
压缩算法可以分为
- 有损压缩
主要用来压缩音视频,它压缩之后会丢失信息 - 无损压缩
这讨论都是无损压缩,即数据经过压缩和解压过程后,与压缩前相比100%相同。
数据为什么可被压缩呢?各种各样压缩算法又怎么压缩数据的?
举个极端例子:
00000000000000000000
人肉压缩下:
20个0
20个字符就被压缩成4字符,且可无损还原。
常用压缩算法:ZIP,GZIP,SNAPPY,LZ4,XZ。
选择时考虑数据的压缩率和压缩耗时。一般压缩率越高,压缩耗时越高。
- 若要高性能,可选择压缩速度快的LZ4
- 要更高压缩比,考虑GZIP或压缩率更高的XZ
压缩样本对压缩速度和压缩比的影响也较大,同样大小的一段数字和一段新闻的文本,即使用相同压缩算法,压缩率和压缩时间差异也较大。
所以,有时在选择压缩算法前,用系统样例业务数据做个测试,帮你找到最合适压缩算法。
如果感兴趣,可学习最经典的压缩算法:哈夫曼编码。