消息队列面试解析系列(七)- 数据压缩(上)

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


压缩样本对压缩速度和压缩比的影响也较大,同样大小的一段数字和一段新闻的文本,即使用相同压缩算法,压缩率和压缩时间差异也较大。

所以,有时在选择压缩算法前,用系统样例业务数据做个测试,帮你找到最合适压缩算法。


如果感兴趣,可学习最经典的压缩算法:哈夫曼编码。

上一篇:使用SAP Analytics Cloud显示新冠肺炎病毒感染人数的实时信息


下一篇:Discourse 如何限制存储到 S3 的备份文件数量