聊聊数据压缩
什么情况适合使用数据压缩?
数据压缩不仅能节省存储空间,还可以用于提升网络传输性能。
通过网络传输数据,使用数据压缩前后,处理的时间会有一些差别:
- 压缩前:传输未压缩数据耗时
- 压缩后:压缩耗时+传输压缩数据耗时+解压耗时
压缩和解压缩的操作都是计算密集型操作,非常耗费CPU资源,如果我们的应用处理业务逻辑本身就需要耗费大量的CPU资源,就不太适合再进行压缩和解压缩操作。
如果我们的系统瓶颈在于磁盘IO,同时CPU资源又有大量空闲,那么就非常适合在将数据写入磁盘前先进行压缩。
数据压缩的本质是资源的置换,是一个时间换空间,或者说CPU资源置换存储资源的操作。
需要选择什么压缩算法?
压缩算法可以分为有损压缩和无损压缩,有损压缩主要用来压缩音视频,它在压缩之后会丢失消息,而无损压缩的数据,在经过压缩和解压缩后,数据是没有变化的。
目前常用的压缩算法包括:ZIP、GZIP、SNAPPY、LZ4等,选择压缩算法时,主要考虑数据的压缩率和压缩耗时。一般来说,压缩率越高的算法,压缩耗时也越高。如果对性能要求很高,可以选择压缩速度快的算法,比如LZ4,如果需要更高的压缩比,可以考虑GZIP算法。
压缩样本对压缩速度和压缩比的影响也是比较大的,同样大小的一段数字和一段新闻的文本,即使是使用相同的压缩算法,压缩率和压缩时间的差异也是比较大的,所以在选择压缩算法之前,可以先尝试用我们系统中真正使用的数据做一些测试,这样可以找到最合适的压缩算法。
如何选择合适的压缩分段?
大部分压缩算法的区别主要在于对数据进行编码不同,压缩的流程和压缩包的结构大致一样,而在压缩的过程中,我们需要了解如何选择合适的压缩分段大小。
在压缩时,给定的被压缩数据必须由确定的长度,或者说是有头有尾的数据,不能是一个无限的流数据。如果要对流数据进行压缩,也需要把流数据划分成多个帧,一帧一帧的分段压缩。
压缩算法在开始压缩之前,一般都需要对被压缩数据从头到尾进行一次扫描,扫描的目的是确定如何对数据进行划分和编码,一般的原则是重复次数多、占用空间大的内容,使用尽量短的编码,这样压缩率会更高。
被压缩的数据长度越大,重码率会越高,压缩比也就越高。
分段也不是越大越好,实际上分段大小超过一定长度后,再增加长度对压缩率的共享就不大了,同时,过大的分段长度,在解压缩时,会有更多的解压浪费。
我们需要根据具体的业务场景,选择合适的压缩分段,在压缩率、压缩速度和解压浪费之间找到一个合适的平衡。
Kafka如何处理消息压缩?
Kafka是否开启消息压缩,是可以进行配置的,它也支持配置使用哪一种压缩算法。
在开启压缩时,Kafka选择一批消息一起压缩,每一批消息就是一个压缩分段。使用者也可以通过参数来控制每批消息的大小。
Kafka并不需要在服务端对接收到的批消息进行解压,而是整批直接存储,然后将其发送给消费者,由消费者对批消息进行解压处理。
不在服务端解压,就不会耗费服务端的CPU资源,同时传递消息数据时,真用的传输带宽也会小。
在使用Kafka时,如果生产者和消费者的CPU资源不是特别吃紧,开启压缩后,可以节省网络带宽和服务端的存储空间,提升总体的吞吐量。