Kafka 消息支持的压缩方式有:
- GZIP:使用GZIP算法压缩消息体,压缩率高但压缩过程比较消耗CPU。
- Snappy:Google开发的压缩算法,压缩率稍低但压缩速度很快。
- LZ4:压缩率与GZIP相当但压缩速度更快,CPU消耗较低。
- ZSTD:压缩率高且压缩速度也很快,是当下比较流行的压缩算法。
消息压缩的主要作用是:
- 减少消息存储空间,降低磁盘占用量。
- 加快网络传输速度,减少网络流量。
- 降低Page Cache占用,增加更多消息缓存在内存。
消息压缩工作机制:
- 生产者可以在发送消息时选择是否压缩以及压缩方式。如果选择压缩,会在发送消息前先压缩消息体。
- Broker在接收到消息后,会将消息以原格式写入磁盘日志。同时会更新索引以标识该消息为压缩消息。
- 消费者在拉取消息时,Broker会根据索引检查消息是否为压缩消息。如果是,会实时解压该消息后返回给消费者。
- 对于历史消息,Broker会定期启动压缩线程,将日志文件中连续的压缩消息进行组合压缩,生成压缩块。
- 压缩线程也会定期解压压缩块生成未压缩消息,删除原压缩消息,实现消息日志的压缩清理。
例如,生产者choose GZIP算法压缩文本消息,那么消费者消费到这条消息时,Broker会实时解压该消息,消费者收到的消息体为未压缩原文文本。
例如,日志文件中有1万条Snappy压缩消息,经压缩线程组合压缩后生成10个Snappy压缩块。之后定期生成未压缩消息删除原压缩消息,实现历史日志压缩。
理解Kafka消息压缩的机制,有助于我们选择适合的压缩方式来优化Kafka的存储空间和网络效率。