Выполнение асинхронного преобразования в потоке Kafka

Предположим, у меня есть две темы Kafka, A и B. Я пытаюсь разработать систему, которая извлекает записи из A, применяет преобразование к каждой записи, а затем публикует преобразованные записи в B. В этом случае преобразование включает вызов конечной точки REST через HTTP.

Будучи относительно новичком в Kafka, я был рад видеть, что проект Kafka Streams уже решил этот тип проблемы (потребление-преобразование-публикация). К сожалению, я обнаружил, что преобразования в потоках Kafka являются блокирующими операциями. Инстинктивно я пытаюсь вызвать конечные точки HTTP неблокирующим асинхронным способом.

Значит ли это, что Kafka Streams в этой ситуации работать не будет? Означает ли это, что я должен вернуться к вызову конечной точки REST в режиме блокировки? Это вообще приемлемый шаблон для Kafka Streams? Обработка данных на основе потока все еще относительно нова для меня, поэтому я не совсем знаком с ее моделями параллелизма.


person Adam Paynter    schedule 11.06.2016    source источник
comment
Было бы неплохо узнать немного больше, что именно вы собираетесь делать со звонками. Не могли бы вы опубликовать (псевдокод) для создания экземпляра Kafka Streams, который вы используете? Я спрашиваю, потому что вызов конечной точки REST не похож на типичное преобразование. Последнее часто подразумевает изменение ключей и значений.   -  person Matthias J. Sax    schedule 13.06.2016
comment
Адам, изучали ли вы реальные асинхронные методы решения этой проблемы? Посмотрев на это подробнее, я думаю, что мой ответ мог быть неполным или неправильным.   -  person Dmitry Minkovsky    schedule 06.10.2016


Ответы (1)


Обновление: изучив это подробнее, я не уверен, что это правильный ответ ...


Я новичок в потоках Кафка и Кафка (далее именуемых «Кафка»), но, столкнувшись с подобными вопросами и рассматривая их, вот моя точка зрения:

Кафка имеет две характерные особенности:

  1. Параллелизм достигается за счет разделения тем.
  2. Внутри раздела темы обработка строго упорядочена, по очереди.

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

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

Итак, что касается:

Значит ли это, что Kafka Streams в этой ситуации работать не будет?

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

Означает ли это, что я должен вернуться к вызову конечной точки REST в режиме блокировки?

Да, я думаю, что это так, но я не уверен, почему это может быть «реверсия». Лично мне нравится Kafka: код блокировки проще. Если я хочу большего параллелизма, я могу запускать больше потоков. В конце концов, нет общего состояния.

person Dmitry Minkovsky    schedule 17.06.2016
comment
Кстати, я не думаю, что здесь есть что-то особенное в том, чтобы сделать HTTP-запрос. Вы можете заменить HTTP-запрос на доступ к любому удаленному состоянию. Может быть, это удаленная база данных? В любом случае доступ должен быть синхронным, потому что ваши функции обработки потока выполняются сверху вниз один раз для каждого сообщения. - person Dmitry Minkovsky; 17.06.2016
comment
Да, и, кстати, соответствующую конфигурацию можно найти здесь: docs.confluent.io/2.1.0-alpha1/streams/: num.stream.threads: The number of threads to execute stream processing; поэтому, если вы хотите обрабатывать много разделов на одной машине, вы можете просто увеличить количество потоков, чтобы оно соответствовало количеству разделов. - person Dmitry Minkovsky; 17.06.2016
comment
Опять же, я не думаю, что вам даже нужно увеличивать количество потоков. Kafka назначает разделы задачам, и я думаю, что один поток может просто обрабатывать все разделы (docs.confluent.io/2.1.0-alpha1/streams/). - person Dmitry Minkovsky; 17.06.2016
comment
Просто подчеркнем, что последние версии документации для этого доступны по адресу docs.confluent.io/3.0.0/streams/. Ссылки /2.1.0-alpha1/ предназначались для предварительного просмотра Kafka Streams Tech Preview, который объявлен устаревшим после того, как Apache Kafka 0.10.0.0 (который включает в себя первый выпуск Kafka Streams) официально доступен. - person Michael G. Noll; 04.07.2016