07、Kafka实战:生产者压缩算法

一.压缩(compression)

  • 秉承了时间换空间trad-off思想
  • 用CPU时间换磁盘空间或网络I/O传输量;

二.怎么压缩

kafka如何压缩消息

  • kafka的消息层次分为两层:
  • 消息集合(message set)以及 消息(message)
  • 一个消息集合中包含若干条日志项(record item),而日志项才是真正封装消息的地方。
  • kafka底层的消息日志由一系列消息集合日志项组成。
  • kafka通常不会直接操作具体的一条消息,他总是在消息集合这个层面进行写入操作。

V2版本改进:

  • 把消息的公共部分抽取出来放到外层消息集合里面,这样就不用每条消息都保存这些信息

  • 原来V1消息每条消息都需要执行CRC校验,但是有些情况下消息的CRC值会发生变化。

  • V2版本中,消息CRC校验工作就被移到消息集合这一层。

保存压缩消息的方法

  • v1版本:保存压缩消息的方法就是把多条消息进行压缩然后保存在外层消息的消息体字段中;
  • v2版本:对整个消息集合进行压缩。显然后者 应该比前端更好的压缩效果。

相同条件:不论是否启用压缩,v2版本都比v1版本节省磁盘空间:

启动压缩时空间效果更明显:

*

三.何时压缩?

kafka中,压缩可能发生在两个地方:生产者端和Broker端

生产者程序中配置compression.type参数即表示启动指定类型的压缩算法。

下面这段程序代码展示如果构建一个开启GZIP的Producer对象:

 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);
  • 关键代码行是props.put(“compression.type”, “gzip”)
  • 表示该Producer压缩算法使用的是GZIP。
  • 这样Producer启动后生产的每个消息集合都经过GZIP压缩过。很好节省压缩网络传输带宽以及kafka Broker端的磁盘占用。

Broker端为啥进行压缩:

大部分情况下Broker从Producer端接收消息后仅仅原封不动的保存而不会对其进行任何改动。

  • Broker 端指定了和 Producer 端不同的压缩算法。
  • 情况二:Broker 端发生了消息格式转换。

四.什么时候解压缩?

  • Poducer端压缩,Broker端保持,Consumer端解压缩

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: