Несколько потребителей на основе ключа записи потребителя в весенней загрузке кафки - PullRequest
0 голосов
/ 09 января 2020

Я хочу перечислить kafka topi c на основе ключа записи потребителя. Сейчас у меня есть потребитель, и в зависимости от условия я обрабатываю запись

@KafkaListener(topics = "topic",
        containerFactory = "kafkaListenerStringContainerFactory")
public void listenasString(ConsumerRecord<String, String> cr) {
  if (cr.key().equals("A")) {
    //do some processing
  } else if (cr.key().equals("B")) {
    //do some processing
  }

}

Возможно ли, чтобы несколько потребителей прослушивали одну и ту же топику c на основе ключа?

Ответы [ 3 ]

1 голос
/ 09 января 2020

Я не уверен, что то, что вы хотите, возможно

есть несколько потребителей для прослушивания одной и той же темы c

Да, это возможно

на основе ключа

Это не так, потому что ключ не является запрашиваемым. Вам нужно будет вычислить раздел этого ключа , затем вам нужно будет присвоить потребителю этому разделу .

Вне Spring вы можете инициализировать DefaultPartitioner и использовать consumer.assign для выполнения этой работы

Оттуда я бы предложил использовать один потребительский поток на раздел и ваш вторичный, если для операторов потребовалось бы перемещать, если в одних разделах нет нескольких ключей (что возможно)

0 голосов
/ 09 января 2020

Вы можете использовать потоки для создания двух тем на основе ключей и запуска потребителя для каждой из этих тем. Но если вы хотите, чтобы это было в той же самой топи c, тогда ответ @ criket_007 верен, это невозможно.

Проверьте ветвь потока Кафки https://docs.confluent.io/current/streams/developer-guide/dsl-api.html#stateless -преобразования

0 голосов
/ 09 января 2020

установить параллелизм слушателя kafka больше 1

spring.kafka.listener.concurrency=3 
...