背景:我用opencv获取摄像头的rtsp流,捕获到每帧,把帧进行base64编码,然后通过Kafka把编码后的帧发送出去
最初Kafka发视频文件和发摄像头的帧是没问题的,生产者可以一直发送,消费者可以一直接收。后来为了模拟不同清晰度的视频流,让视频流代码使用不同清晰度的视频文件发送和存储,于是修改了Kafka一些参数,现在的参数导致生产者连续发送几十帧或者一百多帧时会报错。
org.apache.kafka.common.errors.RecordTooLargeException: The request included a message larger than the max message size the server will accept.
意思是生产者发送的消息过大,大于broker的配置,但是实际上我在消费者和broker都做的参数调整,否则消息一开始就发不出去,而不是发几十帧以后才出错。报了红色信息的帧就发不出去,消费者接收不到。
最终调整参数解决了此问题。在服务端的配置文件server.properties加上的message.max.bytes配置,我目前设置为20971520,即20MB,还可以根据实际情况增大。在生产者端配置max.request.size,这是单个消息最大字节数,根据摄像头清晰度调整,max.request.size必须小于message.max.bytes以及消费者的max.partition.fetch.bytes。这样消息就能不断发送。