【问题标题】:Can a Kafka broker retain messages while there are no consumers connected?没有消费者连接时,Kafka 代理可以保留消息吗?
【发布时间】:2017-07-31 06:11:00
【问题描述】:

我正在尝试构建一个 pub/sub 应用程序,并且正在探索最好的工具。我目前正在查看 Kafka 并且已经运行了一个小演示应用程序。但是,我遇到了一个概念问题。

我有一个生产者(Java 代码):

    String topicName = "MyTopic;
    String key = "MyKey";

    Properties props = new Properties();
    props.put("bootstrap.servers", "localhost:9092,localhost:9093");
    props.put("acks", "all");
    props.put("key.serializer","org.apache.kafka.common.serialization.StringSerializer");
    props.put("value.serializer", "org.apache.kafka.common.serialization.ByteArraySerializer");
    Producer<String, byte[]> producer = new KafkaProducer <String, byte[]>(props);

    byte[] data = <FROM ELSEWHERE>;
    ProducerRecord<String, byte[]> record = new ProducerRecord<String, byte[]>(topicName, key, data);

    try {
        RecordMetadata result = producer.send(record).get();
    }
    catch (Exception e) {
        // Nothing for now
    }
    producer.close();

当我通过 Kakfa 命令行工具启动消费者时:

kafka-console-consumer --bootstrap-server localhost:9092 --topic MyTopic

然后我执行生产者代码,我看到数据消息显示在我的消费者终端上。

但是,如果我在执行生产者之前运行消费者,则消息会显示为“丢失”。当我启动消费者(执行生产者之后)时,消费者终端中什么也没有出现。

有谁知道在没有消费者连接的情况下是否可以让 Kafka 代理 保留 消息?如果有,怎么做?

【问题讨论】:

  • 尝试附加 --from-beginning 以查看您的问题是否消失。这可能是因为默认的偏移重置策略。在消费者配置中查看auto.offset.reset 的详细信息。
  • @amethystic 是的,做到了!感谢您的参考。把它放在答案中,我会接受。很高兴看到它还显示了我所有其他“丢失”的消息。
  • 在学习过程中不要错过这些设置的一个很好的起点是kafka.apache.org/quickstart

标签: java apache-kafka messagebroker


【解决方案1】:

--from-beginning 附加到控制台消费者命令,使其从最早的偏移量开始消费。这实际上是关于由配置auto.offset.reset 控制的偏移重置策略。以下是此配置的含义:

当 Kafka 中没有初始偏移量或服务器上不再存在当前偏移量时该怎么办(例如,因为该数据已被删除):

earliest:自动将偏移量重置为最早的偏移量

latest:自动将偏移量重置为最新的偏移量

none: 如果没有为消费者组找到先前的偏移量,则向消费者抛出异常 其他任何事情:向消费者抛出异常。

【讨论】:

  • 正是我需要的。
猜你喜欢
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 2016-12-02
相关资源
最近更新 更多