Как писать потребители Kafka - однопоточные против многопоточных - PullRequest
0 голосов
/ 27 апреля 2018

Я написал одного потребителя Kafka (используя Spring Kafka), который читает из одной темы и является частью группы потребителей. Как только сообщение используется, оно выполняет все последующие операции и переходит к следующему смещению сообщения. Я упаковал это как файл WAR, и мой конвейер развертывания передает это одному экземпляру. Используя мой конвейер развертывания, я мог бы потенциально развернуть этот артефакт в нескольких экземплярах в моем пуле развертывания.

Однако я не могу понять следующее, когда я хочу, чтобы несколько потребителей были частью моей инфраструктуры -

  • Я могу фактически определить несколько экземпляров в моем пуле развертывания и включите эту WAR во всех этих случаях. Это будет означать, что все они слушают одну и ту же тему, являются частью одного и того же потребителя группа и фактически разделит разделы между собой. нисходящая логика будет работать как есть. Это прекрасно работает для моего Случай использования, однако, я не уверен, если это оптимальный подход к следовать?

  • Читая онлайн, я наткнулся на ресурсы здесь и здесь , где люди определяют единую потребительскую нить, но внутренне, создание нескольких рабочих потоков. Есть также примеры, где мы может определить несколько потоков потребителей, которые делают нисходящую логику. Думая об этих подходах и сопоставляя их с развертыванием окружающей среды, мы могли бы достичь того же результата (как мой теоретический Решение выше может), но с меньшим количеством машин.

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

Хотя я знаю, что я не разместил никакого кода, пожалуйста, дайте мне знать, если мне нужно перенести этот вопрос на другой форум. Если вам нужны конкретные примеры кода, я тоже могу их предоставить, но я не думаю, что они важны в контексте моего вопроса.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Если ваш текущий подход работает, просто придерживайтесь его. Это простой и элегантный способ.

Вы подходите ко 2, только если по какой-то причине вы не можете увеличить количество разделов, но вам нужен более высокий уровень параллелизма. Но тогда у вас есть проблемы с порядком и расами. Если вам когда-нибудь понадобится пойти по этому пути, я бы порекомендовал библиотеку akka-stream-kafka , которая предоставляет средства для правильной обработки фиксации смещения и выполнения того, что вам нужно параллельно, а затем слияния обратно в единый поток, сохраняющий исходное упорядочение и т. д. В противном случае эти вещи подвержены ошибкам, чтобы сделать их самостоятельно.

0 голосов
/ 27 апреля 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...