
# Kafka消息压缩配置建议
#### 应用场景
在Kafka消息存储与传输流程中，消息压缩是一种优化性能、降低资源开销的方法。Kafka支持GZIP、SNAPPY、LZ4等多种压缩算法，这些算法在消息写入磁盘前对其进行压缩，既能减少存储空间占用，也能在网络传输过程中降低带宽消耗。
**压缩原理介绍：**
Kafka压缩算法在**生产者客户端** 配置时，即可同时优化"磁盘存储"和"网络传输"，也能提高吞吐量。如果Kafka压缩算法在**服务端**配置，不但会增加服务端的CPU、网络带宽等的消耗，导致性能瓶颈，还会降低吞吐量。
在生产者客户端配置压缩算法的原理如下：
1. 生产者客户端压缩消息：生产者客户端配置指定压缩算法后，先将多条消息批量压缩成一个数据包，然后通过网络发布至服务端。
2. 服务端存储消息：服务端接收数据包后，无需解压，直接存储到磁盘。
3. 消费者客户端解压消息：消费者客户端从服务端拉取数据包后，根据它的压缩算法标识，使用对应的算法解压数据包，获取原始消息。
**压缩算法对比：**
Kafka支持的压缩算法在核心指标上存在显著差异，具体请参考[表1]。
 表1压缩算法核心指标说明 
| 压缩算法   | 压缩率 | 压缩/解压速度 | CPU消耗 | 适用场景                                       |
|:---|:---|:---|:---|:---|
| GZIP   | 高   | 慢       | 高     | 追求最高压缩率，可以接受较高的延迟和CPU消耗，网络传输成本极高的场景。       |
| SNAPPY | 中等  | 快       | 低     | **通用首选**。在压缩率和压缩/解压速度之间有很好的平衡。CPU开销低，性能稳定。 |
| LZ4    | 较低  | 极快      | 非常低   | 追求最高的压缩/解压速度，CPU开销最小。                      |
   
#### 配置消息压缩算法
在生产者客户端配置"compression.type"参数来启用指定类型的压缩算法。
```
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);
```
