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) префикс темы журнала изменений.

вопросы

  1. что означает эта ошибка и что вызывать его.
  2. учитывая, что вы можете иметь несколько экземпляров вашего приложения, работающих с одним и тем же идентификатором, чтобы потреблять из нескольких разделов темы, что делает "должен быть уникальным в кластере Кафки" в смысле?
  3. можете ли вы использовать те же потоки Кафки application.id для начала два KafkaStreams которые перечислены по разным темам? и если да, то как?

детали: Кафка 0.11.0.2

1 ответов


потоки Кафки масштабируются через разделы, а не темы. Таким образом, если вы запускаете несколько приложений с одним и тем же application.id Они должны быть идентичны в отношении темы ввода, на которую они подписываются, и их логики обработки. Приложение формирует потребительскую группу, используя application.id as group.id и, таким образом, различные разделы входной темы(ов) назначаются различным экземплярам.

если у вас есть другая тема с то же самое логика, вы можете подписаться на все темы сразу (в каждом экземпляре вы начинаете). Однако масштабирование по-прежнему основано на разделах. (Это в основном "слияние" ваших тем ввода.)

если вы хотите масштабировать через темы и / или иметь другую логику обработки, вы должны использовать разные application.id для различных приложений потоков Кафки.