腾讯云消息队列 Pulsar 版实战教程 - 消息压缩
文档简介:
背景描述:
由于 Pulsar 限制消息最大为5MB,消息体过大将会导致消息发送失败。这时需要客户端将大消息进行压缩,以支持20MB大小的消息体发送。
背景描述
由于 Pulsar 限制消息最大为5MB,消息体过大将会导致消息发送失败。这时需要客户端将大消息进行压缩,以支持20MB大小的消息体发送。
Pulsar 大消息处理
Pulsar 的消息最大限制默认是 5MB,Producer 发送的消息大小超过5MB会导致消息发送失败。如果客户端发送单条消息大小超过该限制,我们可以采用如下两种方式来处理:
Chunk Message:Pulsar 提供 Chunk Message 功能,开启 Chunk 机制时,客户端能够自动对大消息进行拆分,并保证消息的完整性,在 Consumer 能自动整合消息。
压缩消息:主要是对消息数据中相同字符序列进行替换,来压缩消息的大小。Pulsar 支持 LZ4、ZLIB、ZSTD、SNAPPY 四种压缩算法。
我们这里推荐压缩消息对大消息进行处理。
压缩算法分析比较
算法介绍
LZ4
LZ4 是一种无损数据压缩算法,可以提供极快的压缩和解压缩速度,对于 CPU 占用少。
ZLIB
ZLIB 压缩算法是一种常用的无损数据压缩技术,它可以有效地减少收发数据的大小,从而提高网络传输效率和网络容量。ZLIB 压缩算法是基于 Lempel-Ziv 压缩算法的一种变体,可以将原始数据压缩到原来的一半大小以下,并且支持压缩和解压缩操作。
ZSTD
ZSTD 压缩算法是一种 Huffman 编码的压缩算法,是 LZ77 的一种变种,可以针对不同数据进行有效压缩。它是一种实时编码算法,在处理大数据时可以更快速、更高效地压缩数据。相比其他压缩算法,ZSTD 在提高数据压缩率的同时兼顾压缩速度。
SNAPPY
SNAPPY 压缩是一种无损压缩技术,它依赖于 LZ77 原理来实现压缩效果。SNAPPY 压缩的核心原理是:只要数据流找到两个字符串之间的重复,就会用一组更短的代码来表示这个字符串,这样就可以减少数据流的大小。
算法对比
压缩算法
|
压缩比
|
压缩速度
|
解压速度
|
ZLIB 1.2.11 -1
|
2.743
|
110MB/S
|
400MB/S
|
LZ4 1.8.1
|
2.101
|
750MB/S
|
3700MB/S
|
ZSTD 1.3.4-1
|
2.877
|
470MB/S
|
1380MB/S
|
SNAPPY 1.1.4
|
2.091
|
530MB/S
|
1800MB/S
|
吞吐量:LZ4 > SNAPPY > ZSTD > ZLIB
压缩比:ZSTD > ZLIB > LZ4 > SNAPPY
物理资源方面,SNAPPY 算法占用的网络带宽最多,ZSTD 算法占用的网络带宽最少。
各压缩算法测试
测试结果
注意:
以下测试结果仅供参考。压缩效果,需要根据具体消息体内容来验证。
消息大小
|
消息
|
压缩算法
|
topic 监控消息大小
|
客户端消息压缩耗时
|
消息发送耗时
|
5M
|
随机消息体
|
LZ4(阀值5MB)
|
9.95MB
|
31ms
|
0.049ms
|
ZLIB
|
7.26MB
|
31ms
|
0.038ms
|
||
ZSTD
|
8.20MB
|
31ms
|
0.039ms
|
||
SNAPPY(阀值5MB)
|
9.70MB
|
33ms
|
0.046ms
|
||
6M
|
随机消息体
|
ZLIB(阀值6MB)
|
8.71MB
|
35ms
|
0.044ms
|
ZSTD(阀值6MB)
|
9.84MB
|
35ms
|
0.046ms
|
||
20M
|
相同消息体
|
LZ4
|
0.16MB
|
41ms
|
0.006ms
|
ZLIB
|
0.20MB
|
42ms
|
0.006ms
|
||
ZSTD
|
0.01MB
|
42ms
|
0.003ms
|
||
SNAPPY
|
2.47MB
|
41ms
|
0.021ms
|
||
40M
|
相同消息体
|
LZ4
|
0.32MB
|
123ms
|
0.008ms
|
ZLIB
|
0.39MB
|
122ms
|
0.008ms
|
||
ZSTD
|
0.01MB
|
124ms
|
0.004ms
|
||
SNAPPY
|
4.95MB
|
123ms
|
0.036ms
|
||
80M
|
相同消息体
|
LZ4
|
0.63MB
|
241ms
|
0.009ms
|
ZLIB
|
0.39MB
|
244ms
|
0.01ms
|
||
ZSTD
|
0.01MB
|
243ms
|
0.004ms
|
||
SNAPPY(阀值80M)
|
9.9MB
|
243ms
|
0.056ms
|
||
160M
|
相同消息体
|
LZ4
|
1.26MB
|
484ms
|
0.013ms
|
ZLIB
|
1.56MB
|
479ms
|
0.016ms
|
||
ZSTD
|
0.03MB
|
481ms
|
0.004ms
|
||
320M
|
相同消息体
|
LZ4
|
2.5MB
|
1035ms
|
0.03ms
|
ZLIB
|
3.1MB
|
1008ms
|
0.027ms
|
||
ZSTD
|
0.03MB
|
949ms
|
0.004ms
|
||
585M
|
相同消息体
|
LZ4
|
4.59MB
|
1705ms
|
0.027ms
|
ZLIB
|
5.67MB
|
1733ms
|
0.03ms
|
||
ZSTD
|
0.11MB
|
1722ms
|
0.006ms
|
总结:
在纯随机数据流中,四种压缩算法压缩效率都不是很高。消息大小超过5MB,四种压缩算法都无法将消息压缩到5MB以内。
在重复数据较多的数据流中,四种压缩算法可以实现很高的压缩速率,其中 LZ4、ZLIB、ZSTD 压缩算法可以实现将600MB内的消息压缩到5MB以内。
消息压缩 Demo 及使用测试
消息压缩 Demo 可参见:tdmq-sdk-demo。
使用测试
生产端调用参数:
java -jar tdmq-sdk-demo-1.0-SNAPSHOT-jar-with-dependencies.jar pulsar://xxxx:6650eyJrZXlJZCI6ImRlZmF1bHRfa2V5SWQiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJzdXBlcnVzZXIifQ.dYcCfp4XrdWRKdKaWylobY-_xEExfRCi1pMvNyZXbqUpulsar-78ra8ownxb7d/BigMSGSpace/BigMSGTopic subname 1 500 0 1 20480 1 0
消费端调用参数:
java -jar tdmq-sdk-demo-1.0-SNAPSHOT-jar-with-dendencies.jar pulsar://xxxx:6650eyJrZXlJZCI6ImRlZmF1bHRfa2V5SWQiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJzdXBlcnVzZXIifQ.dYcCfp4XrdWRKdKaWylobY-_xEExfRCi1pMvNyZXbqUpulsar-92d7w2mjwmv9/BigMessSpace/BigMessTopic subname 1 500 1