web-dev-qa-db-ja.com

Kafkaストリーム:同じ `application.id`を使用して複数のトピックから消費します

複数の異なるトピックを聞く必要があるアプリケーションがあります。各トピックには、メッセージの処理方法に関する個別のロジックがあります。私は各KafkaStreamsインスタンスに同じkafkaプロパティを使用することを考えていましたが、以下のようなエラーが発生します。

エラー

Java.lang.IllegalArgumentException: Assigned partition my-topic-1 for non-subscribed topic regex pattern; subscription pattern is my-other-topic

コード(kotlin)

class KafkaSetup() {
    companion object {
        private val LOG = LoggerFactory.getLogger(this::class.Java)
    }

    fun getProperties(): Properties {
        val properties = Properties()
        properties.put(StreamsConfig.APPLICATION_ID_CONFIG, "my-app")
        return properties
    }

    private fun listenOnMyTopic() {
        val kStreamBuilder = KStreamBuilder()
        val kStream: KStream<String, String> = kStreamBuilder.stream("my-topic")

        kStream.foreach { key, value -> LOG.info("do stuff") }

        val kafkaStreams = KafkaStreams(kStreamBuilder, getProperties())
        kafkaStreams.start()
    }

    private fun listenOnMyOtherTopic() {
        val kStreamBuilder = KStreamBuilder()
        val kStream: KStream<String, String> = kStreamBuilder.stream("my-other-topic")

        kStream.foreach { key, value -> LOG.info("do other stuff") }

        val kafkaStreams = KafkaStreams(kStreamBuilder, getProperties())
        kafkaStreams.start()
    }
}

複数のトピックにapplication.idを使用できないことを示唆する reference を見つけましたが、それをサポートするリファレンスドキュメントを見つけるのが困難です。 documentation for application.idの状態:

ストリーム処理アプリケーションの識別子。 Kafkaクラスタ内で一意である必要があります。これは、1)デフォルトのクライアントIDプレフィックス、2)メンバーシップ管理用のグループID、3)変更ログトピックプレフィックスとして使用されます。

質問

  1. このエラーの意味と原因は何ですか。
  2. アプリの複数のインスタンスを同じIDで実行して、複数のトピックパーティションから消費できるとすると、何ができるか "Kafka cluster内で一意である必要があります"意味ですか?
  3. 同じKafkaストリームapplication.idを使用して、異なるトピックにリストされている2つのKafkaStreamsを開始できますか?その場合、どのようにですか?

詳細:kafka 0.11.0.2

11
Mike Rylander

Kafka Streamsは、トピックではなく、パーティションを介してスケーリングします。したがって、同じapplication.idを使用して複数のアプリケーションを起動する場合、それらがサブスクライブする入力トピックとその処理ロジックに関して、それらは同一である必要があります。アプリケーションは、application.idgroup.idとして使用してコンシューマーグループを形成します。したがって、入力トピックの異なるパーティションが異なるインスタンスに割り当てられます。

sameロジックを使用して別のトピックがある場合は、allをサブスクライブできますトピックを一度に(開始する各インスタンスで)。ただし、スケーリングは依然としてパーティションに基づいています。 (これは基本的に、入力トピックの「マージ」です。)

トピックを介してスケーリングしたり、異なる処理ロジックを使用したりする場合は、異なるKafka Streamsアプリケーションに対して異なるapplication.idを使用する必要があります。

22
Matthias J. Sax