Kafka: Consumer API vs Streams API

99

Я недавно начал изучать Kafka и в итоге получаю эти вопросы.

  1. В чем разница между Consumer и Stream? Для меня, если какой-либо инструмент / приложение потребляет сообщения от Kafka, является потребителем в мире Kafka.

  2. Чем отличается Stream, поскольку он также потребляет или отправляет сообщения Kafka? и зачем это нужно, если мы можем написать собственное потребительское приложение с использованием Consumer API и обработать их по мере необходимости или отправить их в Spark из потребительского приложения?

Я сделал это в Google, но не получил хороших ответов. Извините, если этот вопрос слишком банален.

SR Натан
источник

Ответы:

103

Обновление от 9 апреля 2018 г . : в настоящее время вы также можете использовать ksqlDB , базу данных потоковой передачи событий для Kafka, для обработки ваших данных в Kafka. ksqlDB построен на основе Kafka Streams API, и он также имеет первоклассную поддержку для «потоков» и «таблиц».

в чем разница между Consumer API и Streams API?

API потоков Kafka ( https://kafka.apache.org/documentation/streams/ ) построен на основе клиентов-производителей и потребителей Kafka. Он значительно мощнее и выразительнее, чем потребительский клиент Kafka. Вот некоторые особенности API Kafka Streams:

  • Поддерживает семантику обработки только один раз (версии Kafka 0.11+)
  • Поддерживает отказоустойчивую обработку с отслеживанием состояния (и, конечно, без сохранения состояния), включая потоковые соединения , агрегирование и управление окнами . Другими словами, он поддерживает управление состоянием обработки вашего приложения из коробки.
  • Поддерживает обработку во время события, а также обработку на основе времени обработки и приема
  • Имеет первоклассную поддержку как для потоков, так и для таблиц , где потоковая обработка встречается с базами данных; на практике большинству приложений потоковой обработки требуются как потоки, так и таблицы для реализации их соответствующих вариантов использования, поэтому, если в технологии потоковой обработки отсутствует какая-либо из двух абстракций (например, нет поддержки таблиц), вы либо застряли, либо должны вручную реализовать эту функцию самостоятельно (Удачи с этим...)
  • Поддерживает интерактивные запросы (также называемые "запрашиваемым состоянием"), чтобы предоставлять последние результаты обработки другим приложениям и службам.
  • Есть более выразительным: он поставляется с (1) функциональный стиль программирования DSL с операциями , такими как map, filter, reduceа также (2) императивный стиль процессора API для , например , делать сложную обработку событий (CEP), и (3) можно даже комбинировать DSL и API процессора.

См. Http://docs.confluent.io/current/streams/introduction.html для более подробного, но все же высокоуровневого введения в Kafka Streams API, которое также должно помочь вам понять различия с потребителем Kafka более низкого уровня. клиент. Также есть учебник на основе Docker для Kafka Streams API , о котором я писал в блоге ранее на этой неделе.

Так чем же отличается API-интерфейс Kafka Streams, поскольку он также потребляет сообщения из Kafka или отправляет им сообщения?

Да, Kafka Streams API может как читать данные, так и записывать данные в Kafka.

и зачем это нужно, если мы можем написать собственное потребительское приложение с использованием Consumer API и обработать их по мере необходимости или отправить их в Spark из потребительского приложения?

Да, вы могли бы написать свое собственное потребительское приложение - как я уже упоминал, API-интерфейс Kafka Streams использует сам клиент-клиент Kafka (плюс клиент-производитель), но вам придется вручную реализовать все уникальные функции, которые предоставляет Streams API. . См. Список выше, чтобы узнать обо всем, что вы получаете «бесплатно». Таким образом, это довольно редкое обстоятельство, когда пользователь выберет низкоуровневый клиент-клиент, а не более мощный API Kafka Streams.

Майкл Г. Нолл
источник
8
В каком случае приложение будет использовать Kafka Consumer API вместо Kafka Streams API?
bhh1988
4
В первую очередь в ситуациях, когда вам нужен прямой доступ к методам нижнего уровня Kafka Consumer API. Теперь, когда доступны Kafka Streams, это обычно делается для довольно специализированных, специализированных приложений и вариантов использования. Вот аналогия: представьте, что Kafka Streams - это машина - большинство людей просто хотят водить ее, но не хотят становиться автомеханиками. Но некоторые люди могут захотеть открыть и настроить двигатель автомобиля по какой-либо причине, и именно тогда вы можете напрямую использовать Consumer API. (При этом у Kafka Streams также есть Processor API для особых нужд.)
Майкл Г. Нолл
1
Я думаю, что главное, что их отличает, - это возможность доступа в магазин. Как только вы поймете силу использования хранилища в потоке, вы поймете силу потоков kafka.
Йонатан Кирон
22

Компонент Kafka Stream, созданный для поддержки преобразования сообщений типа ETL. Средство для ввода потока из темы, преобразования и вывода в другие темы. Он поддерживает обработку в реальном времени и в то же время поддерживает расширенные аналитические функции, такие как агрегирование, управление окнами, соединение и т. Д.

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

Ниже приведены ключевые архитектурные особенности Kafka Stream. Пожалуйста, обратитесь сюда

  1. Разделы и задачи потока : Kafka Streams использует концепции разделов и задач как логические единицы своей модели параллелизма, основанной на разделах тем Kafka.
  2. Модель потоков : Kafka Streams позволяет пользователю настроить количество потоков, которые библиотека может использовать для распараллеливания обработки в экземпляре приложения.
  3. Локальные хранилища состояний: Kafka Streams предоставляет так называемые хранилища состояний, которые могут использоваться приложениями потоковой обработки для хранения и запроса данных, что является важной возможностью при реализации операций с отслеживанием состояния.
  4. Отказоустойчивость: Kafka Streams основывается на возможностях отказоустойчивости, изначально интегрированных в Kafka. Разделы Kafka обладают высокой доступностью и реплицируются, поэтому, когда потоковые данные сохраняются в Kafka, они доступны даже в случае сбоя приложения и необходимости повторной обработки.

Основываясь на моем понимании, ниже приведены ключевые отличия, которые я готов обновить, если какой-либо пункт отсутствует или вводит в заблуждение.

введите описание изображения здесь введите описание изображения здесь

Где использовать Потребитель - Производитель:

  1. Если есть отдельные потребители, используйте процесс сообщения, но не переходите на другие темы.
  2. Что касается пункта 1, если сообщение создается только производителем, нам не нужен Kafka Stream.
  3. Если сообщение потребителя из одного кластера Kafka, но публикуется в разных темах кластера Kafka. В этом случае даже вы можете использовать Kafka Stream, но для публикации сообщений в разные кластеры необходимо использовать отдельный Producer. Или просто используйте механизм Kafka Consumer - Producer.
  4. Пакетная обработка - если есть требование собрать сообщение или какой-либо тип пакетной обработки, можно использовать обычный традиционный способ.

Где использовать Kafka Stream:

  1. Если вы потребляете сообщения из одной темы, преобразовываете и публикуете в других темах, лучше всего подходит Kafka Stream.
  2. Обработка в реальном времени, аналитика в реальном времени и машинное обучение.
  3. Преобразование с сохранением состояния, такое как агрегирование, окно соединения и т. Д.
  4. Планирование использования локальных государственных хранилищ или смонтированных государственных хранилищ, таких как Portworx и т. Д.
  5. Достичь единой семантики обработки и автоматически определяемой отказоустойчивости.
солнце007
источник
1
Замечательно, действительно полезно, но есть одна серьезная ошибка: как только семантика доступна как в Consumer, так и в Streams api, более того, EOS - это просто набор настроек для потребителя / производителя на более низком уровне, так что эта группа настроек вместе с их конкретными значениями гарантировать поведение EOS. В настоящее время я без проблем использую EOS с Consumer api.
uptoyou
Да, верно, мы можем определить семантику Exactly once в Kafka Stream, установив свойство, однако для простого производителя и потребителя нам нужно определить идемпотент и транзакцию для поддержки как единичную транзакцию
sun007
внес
@ sun007, что быстрее для простых приложений, которым не требуются возможности реального времени? а также добавляет ли использование потоковой передачи «лишних» накладных расходов на преобразование, как и любые другие инструменты высокого уровня, помимо встроенной функциональности kafka?
Наг