繁体   English   中英

Kafka 主题到多个 kafka 主题调度程序(同一集群)

[英]Kafka topic to multiple kafka topics dispatcher (same cluster)

我的用例如下:我有一个 kafka 主题A其中的消息“逻辑上”属于不同的“服务”,我既不处理将消息发送到A的系统。

我想根据描述服务的一列(格式为 CSV 样式)从A读取此类消息并将它们分派到同一集群上的一组每项服务主题(我们称它们为A_1, ..., A_n ) ,但没关系)。

服务集是静态的,我目前不必处理添加/删除。

我希望使用KafkaConnect来执行这样的任务,但令人惊讶的是,没有 Kafka 源/接收器(我找不到票,但它们已被拒绝)。

我见过MirrorMaker2但对于我的(简单)用例来说,它看起来有点矫枉过正。

我也知道KafkaStreams但我宁愿不KafkaStreams编写和维护代码。

我的问题是:有没有办法用 kafka 本地工具实现这个主题调度,而无需自己编写 kafka 消费者/生产者?

PS:如果有人认为MirrorMaker2很适合我,我也很感兴趣,我不太了解这个工具。

Mirror Maker 是用来做...镜像的。 当您希望将一个集群从一个数据中心镜像到另一个具有相同主题的集群时,这很有用。 您的用例是不同的。

Kafka Connect 用于通过 Kafka 主题同步不同的系统(例如来自数据库的数据),但我也没有在这个用例中看到它。

我会为此使用 Kafka Streams 应用程序。

就我所知,没有直接的方法可以根据传入的消息将传入的主题消息分支到主题列表。 您需要编写自定义代码来实现这一点。

  1. 使用处理器 API 请参阅此处
  2. 在 Processor 方法中传递主题列表
  3. 使用逻辑识别需要分支的主题
  4. 使用 context.forward 将消息发布到其他主题

context.forward(key, value, To.child("selected topic"))

所有其他答案都是正确的,在撰写本文时,我确实在 Kafka 工具集中找到了任何“仅配置”解决方案。

最后的诀窍是使用Logstash ,因为它的“kafka 输出插件”支持topic-id参数中的 jinja 变量。

因此,一旦您在字段(例如service_name )中有可用的“目标主题名称”,它就像这样简单:

output {
  kafka {
    id => "sink"
    codec => [...]
    bootstrap_servers => [...]
    topic_id => "%{[service_name]}"
    [...]
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM