我正在使用Kafka构建相关系统。假设有一个服务 A 执行数据处理,并且有数千个客户 B 向其提交作业。 B 是短暂的,它们出现在网络上,将数据推送到 A ,然后发生两件重要的事情:
(这与网格计算或mpi没有什么不同。)
这两点都应该使用一个众所周知的correlationId
概念来实现: B 拥有一个唯一的ID(在我的情况下是UUID),它发送给 A in headers,反过来将其用作Reply-To
主题来发送状态更新。这意味着它必须即时创建主题,它们无法预先确定。
我已启用auto.create.topics.enable
,它确实动态创建了主题,但现有的消费者并不知道它们,需要重新启动[以获取主题元数据,我想,如果我理解文档正确的话]。我还检查了消费者的metadata.max.age.ms
设置,但即使我将其设置为非常低的值,它似乎也没有帮助。
据我所知,这尚未得到答复,即:kafka filtering/Dynamic topic creation,kafka consumer to dynamically detect topics added,Can a Kafka producer create topics and partitions?或回答不满意。
由于有数百个 A 和数千个 B ,我无法使用共享主题或类似内容,以免我超载我的网络。我可以使用Kafka的AdminTools
,或其他任何名称来预先创建主题,但我发现它有些愚蠢(尽管我看到了人们使用它进行交谈的现实例子到Zookeeper和Kafka基础设施本身。)
所以问题是,有没有办法动态创建Kafka主题,使消费者和生产者能够在不重新启动或任何事情的情况下意识到它?而且,在最坏的情况下,AdminTools真的会帮助它,我必须在哪一方使用它 - A 或 B ?
Kafka 0.11, Java 8
更新
使用AdminClient
创建主题无论出于何种原因都没有帮助,当我尝试订阅时,消费者仍会抛出LEADER_NOT_AVAILABLE
。
答案 0 :(得分:1)
建议不要创建无限数量的主题。我建议您重新设计拓扑/系统。
我曾想过自己制作动态主题但后来才意识到,最终zookeeper会因为过时的主题而耗尽内存(想象一年后可以创建多少个主题)。如果您确保在创建的主题上有一些上限,这可能会有效。总的来说是行政上的头痛。
如果您使用Kafka查询请求回复,您会发现其他人也说这样做很尴尬(Does Kafka support request response messaging)。
答案 1 :(得分:1)
好的,我会回答我自己的问题。
AdminClient
创建主题仅在创建相应的使用者之前执行。应该注意的是,正如许多人所说的那样,只有当 B 在单一消费者群体中并且用1个分区监听主题时,这才有效。
要了解我正在进行的工作,您可能会看一下我一直在研究https://github.com/ikonkere/magic的中间件框架。