消息队列MQ

Kafka 生产消息降低网络io

本文主要是介绍Kafka 生产消息降低网络io,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、Kafka消息

Kafka消息分为两层:消息集合(message set)以及消息(message)

一个消息集合中包含若干条日志项(record item),而日志项才是真正封装消息的地方。Kafka 底层的消息日志由一系列消息集合日志项组成。Kafka 通常不会直接操作具体的一条条消息,它总是在消息集合这个层面上进行写入操作。

 

在 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);

Broker端的压缩,其实很少会发生,因为大部分情况下 Broker 从 Producer 端接收到消息后仅仅是原封不动地保存而不会对其进行任何修改。

但有两个情况会出现:

情况一:Broker 端指定了和 Producer 端不同的压缩算法。除了producer端,Broker 端也可以设置compression.type 值,如果两者设置的不同,就一定要小心了,因为可能会发生预料之外的压缩 / 解压缩操作,通常表现为 Broker 端 CPU 使用率飙升。

情况二:Broker 端发生了消息格式转换。主要是为了兼容老版本的消费者程序,为了兼容老版本的格式,Broker 端会对新版本消息执行向老版本格式的转换。这个过程中会涉及消息的解压缩和重新压缩。一般情况下这种消息格式转换对性能是有很大影响的,除了这里的压缩之外,它还让 Kafka 丧失了 Zero Copy 特性。 

 

Producer 端压缩、Broker 端保持、Consumer 端解压缩。

除了Consumer端会解压缩,Broker 端也会进行解压缩。每个压缩过的消息集合在 Broker 端写入时都要发生解压缩操作,目的就是为了对消息执行各种验证。这里会对cpu有消耗。

 

 

zstd 算法有着最高的压缩比, LZ4 算法吞吐量最高。

即在吞吐量方面:LZ4 > Snappy > zstd 和 GZIP;而在压缩比方面,zstd > LZ4 > GZIP > Snappy。具体到物理资源,使用 Snappy 算法占用的网络带宽最多,zstd 最少,这是合理的,毕竟 zstd 就是要提供超高的压缩比;在 CPU 使用率方面,各个算法表现得差不多,只是在压缩时 Snappy 算法使用的 CPU 较多一些,而在解压缩时 GZIP 算法则可能使用更多的 CPU。

这篇关于Kafka 生产消息降低网络io的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!