# Consumer 压缩算法
压缩(Compression)的思想
* 时间换空间的 trade-off 思想
## 压缩
Kafka 有两类消息格式
* 社区版本称之为 V1 & V2
* V2 是在 Kafka 0.11.0.0 引入
Kafka 消息层次
* 消息集合(Message set)
* 消息集合中包含若干条日志项(record item)
* 日志项:真正封装消息
* 消息(Message)
* Kafka 底层的消息日志由一系列消息集合日志项组成
* Kafka 在消息集合层面上进行写入操作
V2 的目的
* 把消息的公共部分抽取放到外层消息集合,而不用每条消息都保存
* e.g. CRC 校验:从 V1 版本对于每个消息的校验 -> V2 版本对消息集合的校验
* 压缩方法改变
* V1 压缩方法:多条消息进行压缩然后保存到外层消息体字段中
* V2 压缩方法:对整个消息集合进行压缩
* V2 压缩更有效率
## 何时压缩?
压缩发生的位置
* Producer
* Producer 中配置 compression.type 即启用指定类型的压缩算法
* 常规会在 Producer 对消息进行压缩
* Broker
* 有两种情况需要 Broker 重新压缩
* Broker 指定了和 Producer 不同的压缩算法
* 这种情况会导致 Broker CPU 使用率飙升
* Broker 发生了消息格式转换
* 主要是兼容老版本的 Consumer
* 这种情况会丧失 zero-copy 特性
## 何时解压缩?
* 通常发生在 Consumer 端,Consumer 自行解压缩
* Kafka 会将启用了哪种压缩算法封装进消息集合中
### 总结
* Producer 端压缩
* Broker 端保持 / 解压缩&压缩
* Consumer 端解压缩
## 压缩算法对比
* Kafka 2.1.0 版本之前
* GZIP
* Snappy
* LZ4
* 从 2.1.0 开始
* zstd(i.e. Zstandard)
* Facebook 开源,具有超高压缩比
* 吞吐量
* LZ4 > Snappy > zstd = GZIP
* 压缩比
* zstd > LZ4 > GZIP > Snappy
### 压缩算法评价指标
* 压缩比(compression ratio):原先占用空间 / 压缩后空间
* 压缩 / 解压缩吞吐量,i.e. 每秒压缩、解压缩多少 MB
![](https://img.kancloud.cn/cf/e2/cfe20a2cdcb1ae3b304777f7be928068_411x346.png)
## 最佳实践
* Producer 端完成压缩
* 保障 Producer 机器上 CPU 资源充足
* 如果带宽有限,开启压缩
- 概览
- 入门
- 1. 消息引擎系统
- 2. Kafka 术语
- 3. 分布式流处理平台
- 4. Kafka “发行版”
- 5. Kafka 版本号
- 基本使用
- 6. 生产集群部署
- 7. 集群参数配置
- 客户端实践与原理
- 9. Consumer 分区机制
- 10. Consumer 压缩算法
- 11. 无消息丢失配置
- 12. 客户端高级功能
- 13. Producer 管理 TCP
- 14. 幂等生产者和事务生产者
- 15. 消费者组
- 16. 位移主题
- 17. 消费者组重平衡(TODO)
- 18. 位移提交
- 19. CommitFailedException
- 20. 多线程开发者实例
- 21. Consumer 管理 TCP
- 22. 消费者组消费进度监控
- Kafka 内核
- 23. 副本机制
- 24. 请求处理
- 25. Rebalance 全流程
- 26. Kafka 控制器
- 27. 高水位和 Leader Epoch
- 管理与监控
- 28. Topic 管理
- 29. Kafka 动态配置
- 30. 重设消费者组位移
- 31. 工具脚本
- 32. KafkaAdminClient
- 33. 认证机制
- 34. 云下授权
- 35. 跨集群备份 MirrorMaker
- 36. 监控 Kafka
- 37. Kafka 监控框架
- 38. 调优 Kafka
- 39. 实时日志流处理平台
- 流处理
- 40. Kafka Streams
- 41. Kafka Streams DSL
- 42. Kafka Streams 金融
- Q&A