【发布时间】: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