Kafka - Broker:消息太大

Posted

技术标签:

【中文标题】Kafka - Broker:消息太大【英文标题】:Kafka - Broker: Message size too large 【发布时间】:2020-04-06 21:08:06 【问题描述】:

当我尝试发送超过 1 Mb 大小的消息时,我收到 Message size too large 异常。当我尝试生成消息时,错误出现在我的客户端应用程序中。经过一番谷歌搜索后,我发现应该更改设置以增加最大消息大小。好吧,我在/kafka/config/server.properties 文件中做到了。我添加了接下来的 2 个设置:

message.max.bytes=15728640
replica.fetch.max.bytes=15728640

另外,我将fetch.message.max.bytes=15728640 添加到/kafka/config/consumer.properties 文件中。所有其他设置保持默认。

我重新启动了 kafka 服务器,但仍然遇到同样的错误。

P.S Kafka 版本是 1.1.0。

【问题讨论】:

你在link看到这个问题了吗? 您是否参考了上述链接中的某些特定点?因为,我完全按照那里的说明进行了配置。我错过了什么吗? 【参考方案1】:

您的配置正确,但您还需要在生产者端设置 ma​​x.request.size

props.put(ProducerConfig.MAX_REQUEST_SIZE_CONFIG, 15728640);

ma​​x.request.size 请求的最大大小(以字节为单位)。此设置将限制生产者发送的记录批次数 在单个请求中避免发送大量请求。这实际上也是最大记录批量大小的上限。

在代理端,您已经配置了以下应该可以工作的参数

message.max.bytes Kafka 允许的最大记录批量大小。

replica.fetch.max.bytes 尝试为每个分区获取的消息字节数。这不是一个绝对最大值,如果 提取的第一个非空分区中的第一批记录是 大于此值,记录批次仍将返回 确保能够取得进展。最大记录批量大小 代理接受的定义是通过 message.max.bytes (代理 config) 或 max.message.bytes (主题配置)。

在主题端 max.message.bytes 如果您已经在代理端设置了 message.max.bytes,则不需要

ma​​x.message.bytes - 这是代理消息的最大大小 将允许附加到主题。此尺寸已验证 预压缩。 (默认为代理的 message.max.bytes。)

参考 https://kafka.apache.org/documentation/

【讨论】:

在客户端为生产者设置 message.max.bytes 是一个窍门。谢谢你,先生!【参考方案2】:

我想你可能也需要设置batch.size。

我遇到了类似的问题。我用max.message.bytes=4096 创建了一个主题,并使用kafka-producer-perf-test.sh 进行测试。我也设置了max.request.size=4096,但它似乎工作正常。

如果我只带一条消息,那很好。

./kafka/bin/kafka-producer-perf-test.sh --producer-props bootstrap.servers=localhost:9092 max.request.size=4096 --record-size 4008 --topic test-4K-1RF-topic-0 --num-records 1 --throughput 1

如果我只发送多条消息,我会收到 MESSAGE_TOO_LARGE 错误。

./kafka/bin/kafka-producer-perf-test.sh --producer-props bootstrap.servers=localhost:9092 max.request.size=4096 --record-size 4008 --topic test-4K-1RF-topic-0 --num-records 2 --throughput 1

所以我猜这与批量大小有关。然后,我找到了batch.size

所以下面的 sn-p 现在可以工作了!

./kafka/bin/kafka-producer-perf-test.sh --producer-props bootstrap.servers=localhost:9092 batch.size=4096 --record-size 4008 --topic test-4K-1RF-topic-0 --num-records 200 --throughput 10

已编辑:我认为max.request.size 是为了限制生产者发送给 Kafka 代理的包的大小。一个包可以包含多个批次。批量大小受batch.size 限制。

【讨论】:

以上是关于Kafka - Broker:消息太大的主要内容,如果未能解决你的问题,请参考以下文章

java——spring boot集成kafka——broker主题分区副本——概念理解

kafka---broker 保存消息

Kafka-常用术语(消息生产者消费者集群broker解释)

Kafka消息队列大数据实战教程-第五篇(Broker工作原理以及节点服役)

Kafka消息队列大数据实战教程-第五篇(Broker工作原理以及节点服役)

kafka简介(三):kafka架构图