apache-kafka - 具有多个输出主题的 Kafka 流拓扑的并发性

标签 apache-kafka apache-kafka-streams

给定将消息发布到两个不同主题的 Kafka 流拓扑,是否有任何保证在这两个分支中执行各个步骤的顺序,或者这些分支是否完全分离并并行执行?
例子

    KStream<..., ...> filteredStream = builder.stream("input-topic", ...).filter(...)...;

    filteredStream.mapValues(this::mapOne).to("output-topic-one", ...);
    filteredStream.flatMap(this::mapTwo).to("output-topic-two", ...);
在这个例子中,将 mapOne执行并发布到输出主题- 完成 之前 mapTwo甚至被调用或消息被发布到输出主题- 两个 ?换句话说,是否有保证 mapOne即将完成之前 消息发布到 output-topic- 两个 ?
拓扑可视化
查看拓扑描述的可视化时(见底部;由 https://zz85.github.io/kafka-streams-viz/ 制作),您可以看到两个分支。但是您也可以在每个气泡中看到这些数字,这也可能表明存在执行顺序(1-4,然后是 5-6-7,然后是 8-9)。
kafka streams topology
拓扑描述
Topologies:
   Sub-topology: 0
    Source: KSTREAM-SOURCE-0000000000 (topics: [input-topic])
      --> KSTREAM-FILTER-0000000001
    Processor: KSTREAM-FILTER-0000000001 (stores: [])
      --> KSTREAM-FILTER-0000000002
      <-- KSTREAM-SOURCE-0000000000
    Processor: KSTREAM-FILTER-0000000002 (stores: [])
      --> KSTREAM-MAP-0000000003
      <-- KSTREAM-FILTER-0000000001
    Processor: KSTREAM-MAP-0000000003 (stores: [])
      --> KSTREAM-FILTER-0000000004
      <-- KSTREAM-FILTER-0000000002
    Processor: KSTREAM-FILTER-0000000004 (stores: [])
      --> KSTREAM-MAPVALUES-0000000005, KSTREAM-FLATMAP-0000000008
      <-- KSTREAM-MAP-0000000003
    Processor: KSTREAM-MAPVALUES-0000000005 (stores: [])
      --> KSTREAM-FILTER-0000000006
      <-- KSTREAM-FILTER-0000000004
    Processor: KSTREAM-FILTER-0000000006 (stores: [])
      --> KSTREAM-SINK-0000000007
      <-- KSTREAM-MAPVALUES-0000000005
    Processor: KSTREAM-FLATMAP-0000000008 (stores: [])
      --> KSTREAM-SINK-0000000009
      <-- KSTREAM-FILTER-0000000004
    Sink: KSTREAM-SINK-0000000007 (topic: output-topic-one)
      <-- KSTREAM-FILTER-0000000006
    Sink: KSTREAM-SINK-0000000009 (topic: output-topic-two)
      <-- KSTREAM-FLATMAP-0000000008

最佳答案

Kafka 流始终保证拓扑顺序。它总是在拓扑中传递消息,该拓扑具有边和节点。当您在应用程序中定义拓扑时,这些边和节点已添加到拓扑中。
在你的情况下 filtered stream通过 map values branch在拓扑中,直到该路径结束(在您的情况下接收器 ->主题一)。
然后继续 flat map branch .直到沉到话题二。
它使用该 ID 正确排序。0000000004 -> 0000000005 -> 0000000006 -> 00000000070000000004 -> 0000000008 -> 0000000009有关更多信息,请访问 Kafka 源代码 internal topology builder
并引用 this

关于apache-kafka - 具有多个输出主题的 Kafka 流拓扑的并发性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65796417/

相关文章:

elasticsearch - 重新启动任务后,融合的Kafka Connect Elasticsearch接收器吞吐量永久下降

java - Kafka 流 GlobalKTable 在 Tombstone 上抛出反序列化异常 - 空值 - 记录

apache-kafka - Kafka Streams - 无法重新平衡错误

java - KafkaStreams serde异常

apache-spark - 从多个 Kafka 主题读取 Spark 结构化流应用程序

elasticsearch - 如何使用Kafka将日志保留在logstash中更长的时间?

java - Windows 上的 Apache SSL Kafka | PKIX 路径构建失败

java - 如何将默认的 .ivy2 缓存目录更改为其他目录?

java - 复杂聚合

scala - 卡夫卡流 : adding dynamic fields at runtime to avro record