【发布时间】:2019-11-20 08:08:48
【问题描述】:
我有一个使用一个线程运行的 Kafka-Streams 应用程序,用一个分区处理一个主题就可以了。
我需要同时运行这个应用程序的多个实例来处理不同的主题。在我目前的情况下,所有主题只有一个分区。
当我运行同一应用程序的新实例(具有相同的APPLICATION_ID)处理不同的主题时,Streams 客户端不会在这个新应用程序中创建新任务。第一个实例继续处理任务 0_0 中的第一个主题,第二个实例等待没有分配的分区不做任何事情。
我知道我只使用一个分区的主题,但在这种情况下,如果我有两个实例和两个主题,一个分区要处理,这会产生两个分区,¿为什么不能处理具有单个分区的两个主题同时,在每个实例中都打开?
我怀疑它与 StreamsPartitionAssignor 有关,但不能在 Kafka Streams 应用程序中更改分配策略:
Kafka Streams 不允许使用自定义分区分配器。如果 您自己设置一个,它将被覆盖 StreamsPartitionAssignor [1]。这需要确保——如果 可能——分区被重新分配给相同的消费者(a.k.a. 粘性)在重新平衡期间。
编辑:
应用的拓扑:
[2019-11-20 09:36:35,406] [INFO] stream-thread [avro-to-json-d07ad9ad-f4b6-4787-96cf-19c48e72ad46-StreamThread-1] Starting (org.apache.kafka.streams.processor.internals.StreamThread)
[2019-11-20 09:36:35,407] [INFO] stream-thread [avro-to-json-d07ad9ad-f4b6-4787-96cf-19c48e72ad46-StreamThread-1] State transition from CREATED to RUNNING (org.apache.kafka.streams.processor.internals.StreamThread)
[2019-11-20 09:36:35,407] [INFO] stream-client [avro-to-json-d07ad9ad-f4b6-4787-96cf-19c48e72ad46] Started Streams client (org.apache.kafka.streams.KafkaStreams)
Topologies:
Sub-topology: 0
Source: KSTREAM-SOURCE-0000000000 (topics: [])
--> KSTREAM-MAP-0000000001
Processor: KSTREAM-MAP-0000000001 (stores: [])
--> KSTREAM-MAP-0000000002
<-- KSTREAM-SOURCE-0000000000
Processor: KSTREAM-MAP-0000000002 (stores: [])
--> KSTREAM-TRANSFORM-0000000003
<-- KSTREAM-MAP-0000000001
Processor: KSTREAM-TRANSFORM-0000000003 (stores: [])
--> KSTREAM-SINK-0000000004
<-- KSTREAM-MAP-0000000002
Sink: KSTREAM-SINK-0000000004 (extractor class: kafka.AvroToJson$$Lambda$97/741730375@957e06)
<-- KSTREAM-TRANSFORM-0000000003
【问题讨论】:
标签: java apache-kafka apache-kafka-streams