web-dev-qa-db-fra.com

Kafka Streams: utilisez le même `application.id` pour consommer à partir de plusieurs sujets

J'ai une application qui doit écouter plusieurs sujets différents; chaque sujet a une logique distincte pour la façon dont les messages sont traités. J'avais pensé à utiliser les mêmes propriétés kafka pour chaque instance de KafkaStreams, mais j'obtiens une erreur comme celle ci-dessous.

Erreur

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

Code (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()
    }
}

J'ai trouvé ceci référence qui suggère que vous ne pouvez pas utiliser application.id pour plusieurs sujets, mais j'ai du mal à trouver de la documentation de référence à l'appui. documentation pour application.id États:

Un identifiant pour l'application de traitement de flux. Doit être unique dans le cluster Kafka. Il est utilisé comme 1) le préfixe d'ID client par défaut, 2) l'ID de groupe pour la gestion des membres, 3) le préfixe de rubrique du journal des modifications.

Questions

  1. Que signifie cette erreur et quelles en sont les causes?.
  2. Étant donné que vous pouvez avoir plusieurs instances de votre application exécutées avec le même identifiant à consommer à partir de plusieurs partitions de rubrique, qu'est-ce que "Doit être unique dans le Kafka cluster" = signifie?
  3. Pouvez-vous utiliser les mêmes Kafka streams application.id pour démarrer deux KafkaStreams qui sont listés sur différents sujets? et si oui, comment?

Détails: kafka 0.11.0.2

11
Mike Rylander

Kafka Streams évolue via des partitions, pas des sujets. Ainsi, si vous démarrez plusieurs applications avec le même application.id ils doivent être identiques en ce qui concerne le sujet d'entrée auquel ils sont abonnés et leur logique de traitement. L'application forme un groupe de consommateurs à l'aide de application.id comme group.id et donc différentes partitions de la ou des rubriques d'entrée sont affectées à différentes instances.

Si vous avez un sujet différent avec la même logique , vous pouvez vous abonner à ( tous sujet à la fois (dans chaque cas, vous commencez). Cependant, la mise à l'échelle est toujours basée sur les partitions. (Il s'agit essentiellement d'une "fusion" de vos sujets de saisie.)

Si vous souhaitez évoluer via des rubriques et/ou avoir une logique de traitement différente, vous devez utiliser des application.id pour les différentes applications Kafka Streams.

22
Matthias J. Sax