在kafka的默认配置中,默认单条消息最大为1M,当单条消息长度超过1M时,就会出现发送到broker失败,从而导致消息在producer的队列中一直累积,直到撑爆生产者的内存
当单条发送消息的大小超过1M,则会报一下错误
ERROR Error when sending message to topic testTopic with key: null, value: 2095476 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)org.apache.kafka.common.errors.RecordTooLargeException: The message is 2095510 bytes when serialized which is larger than the maximum request size you have configured with the max.request.size configuration.
主要修改以下几个地方来解决这个问题
修改kafka的broker配置:message.max.bytes(默认:1000000B),这个参数表示单条消息的最大长度。在使用kafka的时候,应该预估单条消息的最大长度,不然导致发送失败。
修改kafka的broker配置,server.properties中添加或者修改:
message.max.bytes=5242880(5M) replica.fetch.max.bytes=6291456 //(6M)
每个分区试图获取的消息字节数。要大于等于message.max.bytes,否则broker会接收此消息,但无法将此消息复制出去,从而造成数据丢失。
修改生产者producer程序端配置,producer.properties中添加或者修改:
max.request.size = 5242880 //(5M)
请求的最大大小为字节。要小于 message.max.bytes
修改消费者consumer程序端配置,consumer.properties中添加或者修改:
fetch.message.max.bytes=6291456 //(6M)
每个提取请求中为每个主题分区提取的消息字节数。要大于等于message.max.bytes,如果不调节这个参数,就会导致消费者无法消费到消息,并且不会爆出异常或者警告,导致消息在broker中累积,此处要注意。