spring cloud stream中关于kafka生产消费大数据量的配置问题

1 基础了解

在这里插入图片描述
producer:生产者,Spring Cloud Stream kafka应用程序
broker: kafka服务
consumer:消费者,Spring Cloud Stream kafka应用程序

待解决的问题:

  • kafka生产消费大数据量的配置问题
    这个问题会是的应用程序抛异常:
    kafka.common.MessageSizeTooLargeException。

我们不看代码,从问题出发,去思考一下。kafka需要从生产者(应用程序A)接受一个具有大数据量的message,然后,将该大数据量的message发送给消费者(应用程序B)。这是一个基本流程。

2 配置步骤

生产者(应用程序A):我不管你(broker)受不受得了,我就是要发大数据量的消息,我任性。
broker:你不管人家受不受的了,你就这么来,我不接受(拒接接受这么大的消息)。
broker:我这里有不少大数据量的消息,我就要发给消费者(应用程序B),我也任性。
消费者(应用程序B):你不管人家受不受的了,你就这么来,我也不接受(拒接接受这么大的消息)。

从上面的对话,我们发现这三个家伙 (生产者(应用程序A),broker,消费者(应用程序B))都有各自的问题。于是他们思考的自身的问题也做出了改变。

生产者(应用程序A):你(broker)多大的数据受的了哇?我听你的,告诉我一下呗。于是有了生产者(应用程序A)一端的配置。
broker:我可以接受10M(比默认的1M大得多了)的message(这小子生产者(应用程序A)说不定一冲动发了11M呢?我还的留点余量11M吧!),于是有了broker的配置。消费者(应用程序B)你要多大的数据量哇!你告诉我,我给你定制发货(发送符合消费者数据量的消息)
消费者(应用程序B):我也就接受个10M吧!别太大了,我hold不住哇!于是有了消费者(应用程序B)的配置。

3 配置详情

配置是给予spring Cloud Stream kafka的,与原生配置不同哟!

3.1 生产者(应用程序A)

需要配置max.reuest.size的值,例如:可以发送1.5M左右的数据到broker

# 解决生产的kafka消息太大,而无法发送到kafka服务器上的问题
spring.cloud.stream.kafka.binder.configuration.max.request.size: 1536000

3.2 消费者(应用程序B)

需要配置max.partition.fetch.bytes的值,例如:可以接受1.5M左右的数据到broker

# 解决kafka消费big size信息时,而产生larger than the fetch size的问题
spring.cloud.stream.kafka.binder.configuration.max.partition.fetch.bytes : 1536000

3.3 broker(leader)

需要配置kafka/config/server.properties,message.max.bytes(默认:1000000B),这个参数表示单条消息的最大长度。在使用kafka的时候,应该预估单条消息的最大长度,不然导致发送失败。
第二点,我们知道broker的数据是会发生主从复制的过程的,所以为了确保这些大数据量的信息可以在主从broker之间顺利复制,则要求配置replica.fetch.max.bytes (默认: 1MB),broker可复制的消息的最大字节数。这个值应该比message.max.bytes大,否则broker会接收此消息,但无法将此消息复制出去,从而造成数据丢失。

4 最后请关注一下源码


package org.springframework.cloud.stream.binder.kafka.config;

import java.util.HashMap;
import java.util.Map;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.util.StringUtils;

/**
 * @author David Turanski
 * @author Ilayaperumal Gopinathan
 * @author Marius Bogoevici
 * @author Soby Chacko
 */
@ConfigurationProperties(prefix = "spring.cloud.stream.kafka.binder")
public class KafkaBinderConfigurationProperties {
	private String[] zkNodes = new String[] {"localhost"};

	private Map<String, String> configuration = new HashMap<>();

这个配置类配置就是我们在spring boot配置文件中写kafka配置时,由spring封装成的对象,里面有些常用的配置。
其中configuration 字段的key来源于kafka-clents包中:

org.apache.kafka.clients.consumer.ConsumerConfig
org.apache.kafka.clients.producer.ProducerConfig

大家多看一下这些代码自己就应该懂怎么配置了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章