Kafka Streams: используйте то же самое приложение.id ' для использования из нескольких тем
у меня есть приложение, которое должно прослушивать несколько разных тем; каждая тема имеет отдельную логику для обработки сообщений. Я думал использовать те же свойства Кафки для каждого экземпляра KafkaStreams, но я получаю ошибку, подобную приведенной ниже.
java.lang.IllegalArgumentException: Assigned partition my-topic-1 for non-subscribed topic regex pattern; subscription pattern is my-other-topic
код (Котлин)
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
в течение нескольких темах, однако мне трудно найти справочную документацию для поддержки этого. The документация на application.id
гласит:
идентификатор приложения потоковой обработки. Должен быть уникальным в кластере Кафки. Он используется как 1) префикс идентификатора клиента по умолчанию, 2) идентификатор группы для управления членством, 3) префикс темы журнала изменений.
вопросы
- что означает эта ошибка и что вызывать его.
- учитывая, что вы можете иметь несколько экземпляров вашего приложения, работающих с одним и тем же идентификатором, чтобы потреблять из нескольких разделов темы, что делает "должен быть уникальным в кластере Кафки" в смысле?
- можете ли вы использовать те же потоки Кафки
application.id
для начала дваKafkaStreams
которые перечислены по разным темам? и если да, то как?
детали: Кафка 0.11.0.2
1 ответов
потоки Кафки масштабируются через разделы, а не темы. Таким образом, если вы запускаете несколько приложений с одним и тем же application.id
Они должны быть идентичны в отношении темы ввода, на которую они подписываются, и их логики обработки. Приложение формирует потребительскую группу, используя application.id
as group.id
и, таким образом, различные разделы входной темы(ов) назначаются различным экземплярам.
если у вас есть другая тема с то же самое логика, вы можете подписаться на все темы сразу (в каждом экземпляре вы начинаете). Однако масштабирование по-прежнему основано на разделах. (Это в основном "слияние" ваших тем ввода.)
если вы хотите масштабировать через темы и / или иметь другую логику обработки, вы должны использовать разные application.id
для различных приложений потоков Кафки.