压缩:Conpression
- 用时间去换取空间的经典 trade-off 思想,用 CPU 时间换磁盘空间或网络 IO 传输量,用较少的 CPU 开销带来更少的磁盘占用或 IO 传输。
Kafka 的消息层次
- 消息集合 message set 和 消息 message,一个消息集合包含多个日志项 record item。日志项才是真正封账消息的地方, Kafka 通常会在消息集合层面进行写入操作。
怎么压缩
- V1(消息数据叫做 message)版本压缩消息:将多条消息数据进行压缩然后保存到外层消息的消息体字段中,V2(消息数据叫做 record) 版本将整个消息集合进行压缩,经过实验发现:后者比前者有更好的压缩效果;
何时压缩
-
生产者端和 broker 端会发生消息压缩
- 生产者端:
Properties props = new Properties();
props.put(“bootstrap.servers”, “localhost:9092”);
props.put(“acks”, “all”);
props.put(“key.serializer”, “org.apache.kafka.common.serialization.StringSerializer”);
props.put(“value.serializer”, “org.apache.kafka.common.serialization.StringSerializer”);
// 开启 GZIP 压缩
props.put(“compression.type”, “gzip”);
Producer<String, String> producer = new KafkaProducer<>(props);-
经过上面代码的处理,broker 接收到的 producer 端的消息就都是经过压缩处理的。
-
broker 端:
- 当 producer 端和 broker 端指定了不同的压缩算法 compression.type 时,会出现 broker 端解压消息/压缩消息。通常会使 broker 端 CPU 飙升。
- 当 Broker 端发生了消息格式转换:当 producer 端发送不同格式的消息,在 Broker 端需进行消息格式统一,我们会将新版本数据格式转化成旧数据格式。期间会涉及消息在 broker 端的解压和压缩,也会让 Kafka 丧失引以为豪的 Zero Copy 特性。
何时解压缩
- 在 Consumer 端进行解压缩。
- Kafka 会将消息所启用的压缩算法封装进消息集合中,以便 Consumer 读取消息集合时获取到压缩算法。
- Producer 端压缩、Broker 端保持、Consumer 端解压缩。
压缩算法比较
- Snappy 最差
- GZIP 较差
- LZ4 较好
- Zstd- Zstandard算法拥有最高的压缩比
V1 和 V2 术语差异点:
- V1(before 0.11.0): message/message set
- V2(after 0.11.0): record/record batch
- Kafka 读写消息的最小单位是 batch 也就是 set
多条消息组成消息集合发送,控制发送的条件是?
- 通过 batch.size 和 linger.ms 设置,linger.ms = 0 就是立即发送。