這篇文章主要討論數據壓縮,數據壓縮不僅可以節省存儲空間,還可以提升網路傳輸性能,不同的壓縮演算法有不同的壓縮比和壓縮耗時,我們需要根據項目需求,選擇不同的壓縮演算法。 ...
什麼情況適合使用數據壓縮?
數據壓縮不僅能節省存儲空間,還可以用於提升網路傳輸性能。
通過網路傳輸數據,使用數據壓縮前後,處理的時間會有一些差別:
- 壓縮前:傳輸未壓縮數據耗時
- 壓縮後:壓縮耗時+傳輸壓縮數據耗時+解壓耗時
壓縮和解壓縮的操作都是計算密集型操作,非常耗費CPU資源,如果我們的應用處理業務邏輯本身就需要耗費大量的CPU資源,就不太適合再進行壓縮和解壓縮操作。
如果我們的系統瓶頸在於磁碟IO,同時CPU資源又有大量空閑,那麼就非常適合在將數據寫入磁碟前先進行壓縮。
數據壓縮的本質是資源的置換,是一個時間換空間,或者說CPU資源置換存儲資源的操作。
需要選擇什麼壓縮演算法?
壓縮演算法可以分為有損壓縮和無損壓縮,有損壓縮主要用來壓縮音視頻,它在壓縮之後會丟失消息,而無損壓縮的數據,在經過壓縮和解壓縮後,數據是沒有變化的。
目前常用的壓縮演算法包括:ZIP、GZIP、SNAPPY、LZ4等,選擇壓縮演算法時,主要考慮數據的壓縮率和壓縮耗時。一般來說,壓縮率越高的演算法,壓縮耗時也越高。如果對性能要求很高,可以選擇壓縮速度快的演算法,比如LZ4,如果需要更高的壓縮比,可以考慮GZIP演算法。
壓縮樣本對壓縮速度和壓縮比的影響也是比較大的,同樣大小的一段數字和一段新聞的文本,即使是使用相同的壓縮演算法,壓縮率和壓縮時間的差異也是比較大的,所以在選擇壓縮演算法之前,可以先嘗試用我們系統中真正使用的數據做一些測試,這樣可以找到最合適的壓縮演算法。
如何選擇合適的壓縮分段?
大部分壓縮演算法的區別主要在於對數據進行編碼不同,壓縮的流程和壓縮包的結構大致一樣,而在壓縮的過程中,我們需要瞭解如何選擇合適的壓縮分段大小。
在壓縮時,給定的被壓縮數據必須由確定的長度,或者說是有頭有尾的數據,不能是一個無限的流數據。如果要對流數據進行壓縮,也需要把流數據劃分成多個幀,一幀一幀的分段壓縮。
壓縮演算法在開始壓縮之前,一般都需要對被壓縮數據從頭到尾進行一次掃描,掃描的目的是確定如何對數據進行劃分和編碼,一般的原則是重覆次數多、占用空間大的內容,使用儘量短的編碼,這樣壓縮率會更高。
被壓縮的數據長度越大,重碼率會越高,壓縮比也就越高。
分段也不是越大越好,實際上分段大小超過一定長度後,再增加長度對壓縮率的共用就不大了,同時,過大的分段長度,在解壓縮時,會有更多的解壓浪費。
我們需要根據具體的業務場景,選擇合適的壓縮分段,在壓縮率、壓縮速度和解壓浪費之間找到一個合適的平衡。
Kafka如何處理消息壓縮?
Kafka是否開啟消息壓縮,是可以進行配置的,它也支持配置使用哪一種壓縮演算法。
在開啟壓縮時,Kafka選擇一批消息一起壓縮,每一批消息就是一個壓縮分段。使用者也可以通過參數來控制每批消息的大小。
Kafka並不需要在服務端對接收到的批消息進行解壓,而是整批直接存儲,然後將其發送給消費者,由消費者對批消息進行解壓處理。
不在服務端解壓,就不會耗費服務端的CPU資源,同時傳遞消息數據時,真用的傳輸帶寬也會小。
在使用Kafka時,如果生產者和消費者的CPU資源不是特別吃緊,開啟壓縮後,可以節省網路帶寬和服務端的存儲空間,提升總體的吞吐量。
作者:李潘 出處:http://wing011203.cnblogs.com/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。