1. Introduction

  • Kafka在主题中的每条消息默认1MB;

  • 因大消息被认为低效inefficient和反模式anti-pattern;

2. Option External Store

  • 使用外部存储,GB级消息;

  • 如发送视频文件,修改客户端,仅向Kafka发送消息的引用(reference);

  • 大消息的存储可以是云存储,如Aws S3,或内部部署的大型文件存储系统,如网络系统或Hdfs;

ExternalStore

3. Option Configuration

  • 通过配置发送超过1MB但小于10MB的消息;

  • 我们需修改主题,生产者,消费者三者的配置,以允许更大的消息大小;

3.1. Broker Side

  • 建议保留broker的最大消息大小的默认值,且仅通过主题级配置覆盖override设置;

Entry Memo

令人迷惑Confusing的设置

broker-side

message.max.bytes

topic-side

max.message.bytes

  • 创建主题topic-large-msg:

./kafka-topics.sh \
	--bootstrap-server 192.168.0.123:9092  \
	--topic topic-large-msg --create \
	--partitions 3 --replication-factor 1
  • 添加必要的配置为10MB:
    And add the necessary max.message.bytes configuration for 10MB

并添加必要的 max.message.bytes 配置为 10MB

./kafka-configs.sh --bootstrap-server 192.168.0.123:9092  \
	--alter --entity-type topics \
	--entity-name topic-large-msg \
	--add-config max.message.bytes=10485880
  • 现在主题已创建,并配置为接受大消息,但还不够,
    还必须设置:replica.fetch.max.bytes=10485880;

  • 以便broker可正确复制replicate大消息,
    此设置只能在server.properties中设置,且必须重启broker;

3.2. Consumer Side

  • 还必须更改消费者端和消费者客户端上的max.partition.fetch.bytes配置;

  • 若此此值小于message.max.bytes,消费者将无法获取这些消息,
    且会陷入处理困境stuck on processing,这是非常不希望的undesirable;

  • 使用—​consumer-property来配置:

./kafka-console-consumer.sh --bootstrap-server 192.168.0.123:9092  \
	--topic topic-large-msg \
	--from-beginning \
	--consumer-property max.partition.fetch.bytes=10485880
  • 或使用Java代码更改:

properties.setProperty(ConsumerConfig.FETCH_MAX_BYTES_CONFIG, "10485880");

3.3. Producer Side

  • 必须更改生产者端producer-side的max.request.size,以确保可发送大消息;

  • Cli使用—​producer-property更改:

./kafka-console-producer.sh --bootstrap-server 192.168.0.123:9092  \
	--topic topic-large-msg \
	--producer-property max.request.size=10485880
  • 或使用Java代码更改:

properties.setProperty(ProducerConfig.MAX_REQUEST_SIZE_CONFIG,"10485880");