kafka单条消息过大发送失败

一、背景

生产环境中使用kafka作为消息队列,生产者发送消息失败,查询报错日志,得到如下输出:

Caused by: org.springframework.kafka.KafkaException: Send failed; nested exception is org.apache.kafka.common.errors.RecordTooLargeException: The message is 4067035 bytes when serialized which is larger than 1048576, which is the value of the max.request.size configuration.

这个错误信息表明生产者尝试发送到Kafka的消息在序列化后大小为4067035字节(约4MB),超过了Kafka配置中的max.request.size参数的限制,该参数当前设置为1048576字节(1MB)

二、原因

排查kafka的max.request.size

排查发现最大的请求大小为10485760字节(10M)

排查springboot配置文件中max.request.size的值

项目中没有配置这个值

排查springboot默认kafka的max.request.size值

springboot中Kafka消息队列的默认max.request.size值通常是1048576字节,即1MB

好了就是这个原因了

三、修改方案

要解决这个问题,通常有以下几种选择:

1. 增加kafka本身的message.max.bytes配置

java 复制代码
message.max.bytes=10485760 # 10MB

当然也可以为特定的主题设置这个值:

bash 复制代码
kafka-topics.sh --alter --zookeeper localhost:2181 --topic your_topic --config max.message.bytes=10485760 

2. 增加生产者max.request.size配置

如果是代码则配置如下

java 复制代码
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("max.request.size", 10485760 ); // 10MB

如果是yml 文件则配置如下

java 复制代码
spring:
  kafka:
    producer:
      properties:
        max.request.size: 10485760 

3. 增加消费者的fetch.max.bytesmax.partition.fetch.bytes配置

如果是代码则配置如下

java 复制代码
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("fetch.max.bytes", 10485760); // 10MB
props.put("max.partition.fetch.bytes", 10485760); // 10MB

如果是yml 文件则配置如下

bash 复制代码
spring:
  kafka:
    consumer:
      properties:
        fetch.max.bytes: 10485760
        max.partition.fetch.bytes: 10485760

4. 分割消息

如果消息非常大,可能需要考虑将其分割成较小的部分,然后在消费者端重新组装。这种方法可以避免配置过大的消息大小限制。

5.生产者压缩消息

你可以启用消息压缩来减少消息的大小。Kafka支持多种压缩算法,如gzip、snappy、lz4等。我们可以在生产者配置中启用压缩:

如果是代码则配置如下:

java 复制代码
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("compression.type", "gzip");

如果是yml 文件则配置如下

java 复制代码
spring:
  kafka:
    producer:
      properties:
        compression.type: gzip
相关推荐
网络工程小王13 小时前
【HCIE-AI】12.deepspeed分布式并行训练进阶版
人工智能·pytorch·分布式·学习·昇腾·deepspeed
ACP广源盛1392462567315 小时前
国产算力互联IX8024@ACP#Kimi K3 开源后的端侧部署硬件架构分析
大数据·人工智能·分布式·单片机·嵌入式硬件
花生了什么事o16 小时前
分布式 ID 生成方案:从数据库自增到雪花算法
数据库·分布式·算法
java1234_小锋16 小时前
【免费】基于Spark实时电商用户行为分析与预测(Java版本+可视化大屏+Kafka+SpringBoot+Vue3) 锋哥原创出品,必属精品
java·spark·kafka·实时电商用户行为分析与预测系统
爱吃提升1 天前
python 分布式爬虫、爬虫合规与综合实战项目
分布式·爬虫·python
ZENERGY-众壹1 天前
跨品牌逆变器升级:华为锦浪德业 API 对接的 7 个坑
分布式·华为·数据归一化·光伏运维·逆变器api
薛定谔的猫19822 天前
LLaMA-Factory +DeepSpeed 分布式多卡训练实战全解
分布式·deepspeed·zero·多卡训练·多卡分布式训练
稚南城才子,乌衣巷风流2 天前
RabbitMQ 消息队列:从入门到实战
分布式·rabbitmq
AI人工智能+电脑小能手2 天前
【大白话说Java面试题 第194题】【08_Kafka篇】第10题:简述 Kafka 的 Rebalance 机制?
java·kafka·消费者组·rebalance·分布式消息队列
Database_Cool_2 天前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql