天天看點

消息隊列面試解析系列(七)- 資料壓縮(上)1 資料壓縮意義2 資料壓縮适用場景    3 壓縮算法抉擇

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

壓縮樣本對壓縮速度和壓縮比的影響也較大,同樣大小的一段數字和一段新聞的文本,即使用相同壓縮算法,壓縮率和壓縮時間差異也較大。

是以,有時在選擇壓縮算法前,用系統樣例業務資料做個測試,幫你找到最合适壓縮算法。

如果感興趣,可學習最經典的壓縮算法:哈夫曼編碼。