Кафка как очередь сообщений для длительных задач - PullRequest
1 голос
/ 14 июня 2019

Мне интересно, есть ли что-то, чего мне не хватает в моей настройке, чтобы облегчить длительные задания.

Для моих целей вполне нормально иметь At most once доставку сообщений, это означает, что не нужно думать о фиксации смещений (или, по крайней мере, можно зафиксировать каждое смещение сообщения при его получении).

У меня есть следующее, чтобы добиться конкурентной потребительской модели:

  • Тема
  • X потребителей в одной группе
  • P разделов в теме (где P> = X всегда)

Моя проблема в том, что у меня есть сообщения, для обработки которых может потребоваться ~ 15 минут (но это может колебаться, скажем, до 50%). Чтобы избежать отмены назначений для потребителей, я увеличил значение max.poll.interval.ms, чтобы отразить это. Однако это имеет некоторые негативные последствия:

  • если какое-либо сообщение превышает этот промежуток времени, то в худшем случае потребитель, обрабатывающий это сообщение, должен будет подождать до значения max.poll.interval.ms для восстановления баланса
  • если мне нужно масштабировать и увеличивать количество потребителей в зависимости от нагрузки, тогда любым новым потребителям может также понадобиться подождать значение max.poll.interval.ms, чтобы произошло перебалансирование для обработки любых новых сообщений

В настоящий момент я вижу, что могу действовать следующим образом:

  • Установите max.poll.interval.ms в качестве небольшого значения и примите во внимание, что каждый потребитель, обрабатывающий каждое сообщение, будет выполнять тайм-аут и проходить через процесс отмены назначений и ожидания небольшого количества времени для восстановления баланса

Однако мне это не нравится, и я рассматриваю альтернативные технологии для своей очереди сообщений, поскольку я не вижу очевидных путей решения этой проблемы. По общему признанию я новичок в Kafka, и это - только внутреннее чувство, что вышеупомянутое не желательно. Раньше я использовал RabbitMQ для этих сценариев, однако в настоящее время нам нужна Kafka в нашей архитектуре для других целей, и было бы неплохо не вводить другую технологию, если Kafka может достичь этого.

Я ценю любые советы, которые кто-либо может предложить по этому вопросу.

1 Ответ

0 голосов
/ 16 июня 2019

Использование Kafka в качестве очереди заданий для планирования длительного выполнения процесса не является хорошей идеей, поскольку Kafka не является очередью в строгом смысле этого слова, а семантика обработки ошибок и повторных попыток ограничена. Хотя вы можете достичь компромисса, поиграв с определенной конфигурацией для восстановления баланса или тайм-аута, он, скорее всего, останется хрупким. Простой ответ заключается в том, что Kafka не был разработан для подобных случаев.

Идея max.poll.interval.ms состоит в том, чтобы предотвратить ситуацию с прямой блокировкой ( см. ), но в вашем случае потребитель отправит ложный положительный результат брокеру Kafka и вызовет перебалансировку, поскольку нет возможности Различать живую блокировку и законный длительный процесс.

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

...