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
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
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.