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

大家多看一下這些代碼自己就應該懂怎麼配置了!

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