Kafka与动态主题相关

时间:2017-10-10 08:34:38

标签: apache-kafka kafka-consumer-api

我正在使用Kafka构建相关系统。假设有一个服务 A 执行数据处理,并且有数千个客户 B 向其提交作业。 B 是短暂的,它们出现在网络上,将数据推送到 A ,然后发生两件重要的事情:

  1. B 会立即收到 A ;
  2. 的状态 然后
  3. B 完全退出,保持在线接收进一步的更新 状态,或偶尔会重新开始检查状态。
  4. (这与网格计算或mpi没有什么不同。)

    这两点都应该使用一个众所周知的correlationId概念来实现: B 拥有一个唯一的ID(在我的情况下是UUID),它发送给 A in headers,反过来将其用作Reply-To主题来发送状态更新。这意味着它必须即时创建主题,它们无法预先确定。

    我已启用auto.create.topics.enable,它确实动态创建了主题,但现有的消费者并不知道它们,需要重新启动[以获取主题元数据,我想,如果我理解文档正确的话]。我还检查了消费者的metadata.max.age.ms设置,但即使我将其设置为非常低的值,它似乎也没有帮助。

    据我所知,这尚未得到答复,即:kafka filtering/Dynamic topic creationkafka consumer to dynamically detect topics addedCan 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

2 个答案:

答案 0 :(得分:1)

建议不要创建无限数量的主题。我建议您重新设计拓扑/系统。

我曾想过自己制作动态主题但后来才意识到,最终zookeeper会因为过时的主题而耗尽内存(想象一年后可以创建多少个主题)。如果您确保在创建的主题上有一些上限,这可能会有效。总的来说是行政上的头痛。

如果您使用Kafka查询请求回复,您会发现其他人也说这样做很尴尬(Does Kafka support request response messaging)。

答案 1 :(得分:1)

好的,我会回答我自己的问题。

  1. 使用AdminClient创建主题仅在创建相应的使用者之前执行。
  2. 改变了我的拓扑结构,考虑了1)并在消息头中引入了相关id的交换(与JMS中相同)。我还必须实现某些拓扑管理方法,将 B 分组到容器中。
  3. 应该注意的是,正如许多人所说的那样,只有当 B 在单一消费者群体中并且用1个分区监听主题时,这才有效。

    要了解我正在进行的工作,您可能会看一下我一直在研究https://github.com/ikonkere/magic的中间件框架。