背景描述
由于 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 及使用测试
使用测试
生产端调用参数:
java -jar tdmq-sdk-demo-1.0-SNAPSHOT-jar-with-dependencies.jar pulsar://xxxx:6650
eyJrZXlJZCI6ImRlZmF1bHRfa2V5SWQiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJzdXBlcnVzZXIifQ.dYcCfp4XrdWRKdKaWylobY-_xEExfRCi1pMvNyZXbqU
pulsar-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