kafka达到最佳吞吐量的消息大小是10k,然而有些场景需要kafka发送很大的消息,比如消息中含有base64格式的图片或短视频信息等。
项目中采用的spring集成kafka模块,如需支持大消息发送,需要进行以下两个方面的配置:
1.Kafka服务配置
1.1 broker配置
server.properties中添加:
- message.max.bytes :20000000(20M),这是单个消息的最大值,kafka默认好像是1M左右
- **replica.fetch.max.bytes **:21000000(21M),这是单个消息的最大值broker可复制的消息的最大字节数,比message.max.bytes大,否则broker会接收此消息,但无法将此消息复制出去,从而造成数据丢失,但是不能太大!!!不然复制的时候容易内存溢出
1.2 producer配置
producer.properties中添加:
- max.request.size: 20000000(20M), 这是生产者能请求的最大消息,大于或等于message.max.bytes
1.3 consumer配置
consumer.properties中添加:
- fetch.message.max.bytes: 21000000(21M), 这是消费者能读取的最大消息,大于或等于message.max.bytes
2.Spring配置
yml或者propertise中配置max.request.size,但实测不生效,需要java中写config,具体的配置可在https://kafka.apache.org/documentation/#producerconfigs中查找,如下进行java的kafka配置:
@Bean
public Map<String, Object> producerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"10.10.100.100:9092");
props.put(ProducerConfig.RETRIES_CONFIG, 3);
//每次批量发送消息的数量(吞吐量和延时性能),默认16k,batch 越小,producer的吞吐量越低,
props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);
props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432); //默认32M
props.put(ProducerConfig.MAX_REQUEST_SIZE_CONFIG, 50000000);
//# 指定消息key和消息体的编解码方式
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
return props;
}