【发布时间】: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