如果只有一条消息大于提取大小

时间:2015-06-17 01:51:39

标签: apache-kafka

在kafka手册网站中,有一个代码块可以从kafka获取消息。但是如果只有一条大于fetch size的消息,它就不起作用。

但是,我们事先并不知道队列的最大大小是多少。有没有办法让它总是至少获取一条消息?

import kafka.api.FetchRequest;
import kafka.javaapi.consumer.SimpleConsumer;
import kafka.javaapi.message.ByteBufferMessageSet;
import kafka.message.Message;
import kafka.message.MessageSet;
import kafka.utils.Utils;

...

// create a consumer to connect to the kafka server running on localhost, port 9092, socket timeout of 10 secs, socket receive buffer of ~1MB
SimpleConsumer consumer = new SimpleConsumer("127.0.0.1", 9092, 10000, 1024000);

long offset = 0;
while (true) {
  // create a fetch request for topic “test”, partition 0, current offset, and fetch size of 1MB
  FetchRequest fetchRequest = new FetchRequest("test", 0, offset, 1000000);

  // get the message set from the consumer and print them out
  ByteBufferMessageSet messages = consumer.fetch(fetchRequest);
  for(MessageAndOffset msg : messages) {
    System.out.println("consumed: " + Utils.toString(msg.message.payload(), "UTF-8"));
    // advance the offset after consuming each message
    offset = msg.offset;
  }
}

1 个答案:

答案 0 :(得分:1)

此处有两种方法:配置服务器以拒绝大于消费者可以获取的最大邮件大小的邮件。在生成/使用主题之前,请确保您的经纪人的max.message.bytes设置和消费者的fetch.message.max.bytes相同(请参阅https://kafka.apache.org/08/configuration.html)。这将把问题推向生产者,以弄清楚如何防止邮件大小过大。

另一种方法是增加消费者的fetch-max-bytes并重试。因此,从consumer.fetch(fetchRequest)捕获MessageSizeTooLarge错误并重试此w /更大的最大消息大小(示例代码中的最后一个参数1000000): FetchRequest fetchRequest = new FetchRequest("test", 0, offset, 1000000) 但这很危险 - 这是最大消息大小配置的重点。

我建议将消息​​大小限制推送给您的制作人。