【问题标题】:How to use instance specific topics in Kafka streams?如何在 Kafka 流中使用实例特定主题?
【发布时间】:2020-08-02 13:02:09
【问题描述】:

我有这个拓扑:

Topology topology = new Topology();

//WS connection processor
topology.addSource(WS_CONNECTION_SOURCE, new StringDeserializer(), new WebSocketConnectionEventDeserializer(), KafkaTopics.WS_CONNECTION_EVENTS_TOPIC)
    .addProcessor(SESSION_PROCESSOR, WSUserSessionProcessor::new, WS_CONNECTION_SOURCE)
    .addStateStore(sessionStoreBuilder, SESSION_PROCESSOR)
    .addSink(WS_STATUS_SINK, KafkaTopics.WS_USER_ONLINE_STATUS_TOPIC, stringSerializer, stringSerializer, SESSION_PROCESSOR)

//WS session routing
    .addSource(WS_ROUTING_BY_SESSION_SOURCE, new StringDeserializer(), new StringDeserializer(),
                    KafkaTopics.WS_DELIVERY_TOPIC)
    .addProcessor(WS_ROUTING_BY_SESSION_PROCESSOR, WSSessionRoutingProcessor::new,
                    WS_ROUTING_BY_SESSION_SOURCE)
    .addStateStore(userConnectedNodesStoreBuilder, WS_ROUTING_BY_SESSION_PROCESSOR, SESSION_PROCESSOR)

//WS delivery
    .addSource(WS_DELIVERY_SOURCE, new StringDeserializer(), new StringDeserializer(),
                    INSTANCE_SPECIFIC_TOPIC)
    .addProcessor(WS_DELIVERY_PROCESSOR,  WSDeliveryProcessor::new, WS_DELIVERY_SOURCE);  

拓扑中最后提到的来源是特定于每个应用实例的主题。我希望该主题仅由该实例处理。该主题的数据由前一个处理器推送,具体取决于哪个实例必须处理该消息。

但是一旦流启动,它就会尝试将特定于实例的主题分区也分配给其他实例。我们可以在 Kafka 流中实现这个要求吗?

我希望一个主题仅由特定实例处理。

【问题讨论】:

  • 作为一个选项,您可以仅在所需实例上添加特定的源和处理器:if (specificInstance) { topology. addSource(.., INSTANCE_SPECIFIC_TOPIC) }
  • 所有实例都需要自己的实例特定主题。处理器逻辑是一样的
  • 如果有 3 个实例,我会为特定实例分别创建 3 个主题。所以最终主题只能由每个实例处理,而不是跨实例分布

标签: apache-kafka apache-kafka-streams


【解决方案1】:

你想要的都是不可能的。对于 Kafka Streams 程序,同一应用程序的所有实例需要完全相同,因此需要具有相同的输入主题。

您需要将您的应用程序拆分为 4 个应用程序:第一个应用程序执行程序的共享分区并写入 3 个不同的主题。此外,您还有 3 个应用程序(带有自己的application.ids),每个应用程序都从这些主题中读取一个。

请注意,如果需要,您可以在同一个 JVM 中运行多个 KafkaStreams 客户端。

【讨论】:

  • 我修改了拓扑结构,每个实例都有 2 个应用程序 ID。一个应用程序 ID 对所有实例都是通用的,并且使用共享主题,第二个应用程序 ID 对每个实例具有不同的源主题并使用不同的应用程序 ID。希望这很好
  • 我有一个相关的问题。创建拓扑后,我们无法更改相同应用程序 ID 的拓扑结构。什么样的变化打破了潮流,什么样的变化是可能的? - 更改源主题、更改主题分区、更改接收器主题、添加/删除处理器
  • 不确定我是否完全理解:但是,如果您部署运行相同代码但连接到不同输入主题的不同实例,则需要为每个实例使用不同的application.ids——它们不能共享相同的application.id,因为程序读取的主题是程序的一部分,因此它的不同程序需要不同的application.ids。 -- 关于哪些更改是兼容的:大多数更改是不兼容的,您应该在重新部署之前重置您的应用程序:docs.confluent.io/current/streams/developer-guide/…
猜你喜欢
  • 2020-05-01
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 2016-02-18
  • 2017-12-25
  • 1970-01-01
相关资源
最近更新 更多