如何通知消费者在Kafka中创建了新主题?

时间:2017-10-10 23:34:02

标签: apache-kafka sarama

我试图让我的消费者动态更新其消费。

让我举一个使用动物的更具体的例子。想象一下,我有一个宠物商店,每个主题都是一种动物(例如狗,猫,鱼)。我的Kafka消费者的主要责任是获取我们在Kafka中的任何日志/记录/消息并将它们存储到数据库中。

假设我的消费者在dogscats主题上积极消费并且一切正常,现在有一种新型动物进入商店并在Kafka集群中生成一个新主题。如何通知我的消费者已添加新主题?

我有两个提案,我想看看你认为哪个更好?或者如果有更好的第三选择,请告诉我。

1。)生产者向消费者发送http请求,让消费者知道生产者即将创建一个新主题,以便消费者可以采取相应的行动。这种方法的问题在于,存在竞争条件。在创建主题之前,消费者有可能尝试消费。 (我实际上刚刚发现,如果我将auto.topic.creation.enable设置为true,那么竞争条件并不是真正的问题。)

2.。)在Kafka集群中创建一个名为topic_updates的额外主题。因此,只要生产者成功地向Kafka集群提交了一条消息,它就会通过这个topic_updates广播新闻,也许一个简单的字符串就可以了。消费者正在积极倾听这一主题更新。

3。)我不知道,理想情况下,我希望Kafka能够在创建新主题时发出事件。

提前谢谢

2 个答案:

答案 0 :(得分:2)

消费者能够自动找到新创建的主题,您可以通过调用consumer.subscribe(Pattern.compile(".*"));

简单地订阅所有主题

可以降低metadata.max.age.ms以让消费者更快地了解新主题。

答案 1 :(得分:0)

您可以使用新的KafkaAdminClient以某种方式监控主题列表并检查新增内容。这是一个示例代码,为您提供主题列表(不包括内部主题):

Properties properties = new Properties();
properties.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
KafkaAdminClient kafkaAdminClient = (KafkaAdminClient) AdminClient.create(properties);
ListTopicsResult listTopicResult = kafkaAdminClient.listTopics();
System.out.println(listTopicResult.names().get().toString());