Что такое Кафка?

Apache Kafka — это система обмена сообщениями, созданная для работы с большими данными. Подобно Apache ActiveMQ или RabbitMq, Kafka позволяет приложениям, созданным на разных платформах, взаимодействовать посредством асинхронной передачи сообщений.

Но Kafka отличается от этих более традиционных систем обмена сообщениями ключевыми моментами:

  • Он предназначен для горизонтального масштабирования за счет добавления большего количества стандартных серверов.
  • Он обеспечивает гораздо более высокую пропускную способность как для процессов-производителей, так и для процессов-потребителей.
  • Его можно использовать для поддержки как пакетных, так и реальных вариантов использования.
  • Он не поддерживает JMS, API промежуточного программного обеспечения Java, ориентированный на сообщения.

Архитектура Кафки

Прежде чем мы исследуем архитектуру Кафки, вы должны знать ее основную терминологию:

  • Производитель – это процесс, который может публиковать сообщения в теме.
  • потребитель — это процесс, который может подписаться на одну или несколько тем и использовать сообщения, опубликованные в темах.
  • Категория темы – это название канала, в котором публикуются сообщения.
  • Брокер – это процесс, работающий на одном компьютере.
  • кластер – это группа брокеров, работающих вместе.

Архитектура Kafka очень проста, что может привести к повышению производительности и пропускной способности в некоторых системах. Каждая тема в Kafka похожа на простой файл журнала. Когда производитель публикует сообщение, сервер Kafka добавляет его в конец файла журнала для данной темы. Сервер также назначает смещение — число, используемое для постоянной идентификации каждого сообщения. По мере роста количества сообщений значение каждого смещения увеличивается; например, если производитель публикует три сообщения, первое может получить смещение 1, второе — смещение 2, а третье — смещение 3.

Когда потребитель Kafka запускается впервые, он отправляет запрос на извлечение на сервер с просьбой получить любые сообщения для определенной темы со значением смещения выше 0. Сервер проверит файл журнала для этой темы и вернет три новых сообщения. . Потребитель обработает сообщения, затем отправит запрос на сообщения со смещением больше, чем 3, и так далее.

В Kafka клиент отвечает за запоминание счетчика смещения и получение сообщений. Сервер Kafka не отслеживает и не управляет потреблением сообщений. По умолчанию сервер Kafka хранит сообщение в течение семи дней. Фоновый поток на сервере проверяет и удаляет сообщения старше семи дней. Потребитель может получить доступ к сообщениям, пока они находятся на сервере. Он может читать сообщение несколько раз и даже читать сообщения в порядке, обратном их получению. Но если потребитель не сможет получить сообщение до истечения семи дней, он пропустит это сообщение.

Кафка: потоковая архитектура

Kafka чаще всего используется для потоковой передачи данных в режиме реального времени в другие системы. Kafka — это промежуточный уровень для отделения ваших конвейеров данных в реальном времени. Ядро Kafka не подходит для прямых вычислений, таких как агрегация данных или CEP. Потоковая передача Kafka, которая является частью экосистемы Kafka, предоставляет возможность выполнять аналитику в реальном времени. Kafka можно использовать для подачи данных в системы быстрого доступа (системы оперативных и оперативных данных), такие как Storm, Flink, Spark Streaming, а также ваши службы и системы CEP. Kafka также используется для потоковой передачи данных для пакетного анализа данных. Кафка кормит Hadoop. Он передает данные в вашу платформу больших данных или RDBMS, Cassandra, Spark или даже S3 для некоторого будущего анализа данных. Эти хранилища данных часто поддерживают анализ данных, создание отчетов, анализ данных, аудит соответствия и резервное копирование.

Как Kafka поддерживает микросервисы

Какой бы мощной и популярной ни была Kafka для приема больших данных, структура данных «журнал» имеет интересные последствия для приложений, построенных на основе Интернета вещей, микросервисов и облачных архитектур в целом. Концепции проектирования на основе предметной области, такие как CQRS и источники событий, являются мощными механизмами для реализации масштабируемых микросервисов, и Kafka может предоставить резервное хранилище для этих концепций. Приложения для сбора событий, которые генерируют много событий, может быть сложно реализовать с помощью традиционных баз данных, а дополнительная функция Kafka под названием «сжатие журнала» может сохранять события на протяжении всего жизненного цикла приложения. По сути, при сжатии журнала вместо удаления журнала через предварительно настроенные интервалы времени (7 дней, 30 дней и т. д.) Kafka может хранить весь набор последних событий для всех ключей в наборе. Это помогает сделать приложение очень слабо связанным, поскольку оно может потерять или отбросить журналы и просто восстановить состояние домена из журнала сохраненных событий.

Стоит ли использовать Кафку?

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

Некоторые варианты использования

Вот описание нескольких популярных вариантов использования Apache Kafka®.

Показатели

Каждый сервис в LinkedIn включает как минимум производителя Kafka, поскольку именно так распространяются метрики. Сюда входят технические показатели (пропускная способность запросов, задержка и т. д.), а также бизнес-показатели (показы объявлений, клики по объявлениям и т. д.). Эти события генерируются со скоростью одно на метрику в минуту на хост и, таким образом, представляют агрегированную информацию (количество, среднее, максимальное, процентили и т. д.), которая загружается в базу данных временных рядов. Таким образом, эти метрики можно почти сразу визуализировать на информационных панелях, и можно изучить их тенденции с течением времени. Оповещения о пороговых значениях также запускаются из этих данных.

Отслеживание

Это похоже на бизнес-показатели, за исключением того, что обычно это более сложное, чем простое числовое значение, вводимое в базу данных временных рядов. Сюда входят, например, события просмотра страницы, которые содержат множество параметров (идентификатор участника, ключ страницы и т. д.). Эти события генерируются со скоростью одно на одно инициирующее событие и, таким образом, могут иметь гораздо больший объем для каждого заданного типа событий, чем метрики. В конечном итоге они попадают в Hadoop (через Gobblin) для пакетной обработки в автономном режиме и в Samza для потоковой обработки в режиме реального времени.

Журналы

Службы могут передавать свои журналы в Kafka, чтобы загружать их в ELK в целях мониторинга.

Метаинфраструктура

Помимо описанных выше вариантов использования, которые очень распространены в отрасли, Kafka также используется в качестве строительного блока почти во всех других элементах инфраструктуры LinkedIn:

  • Espresso, хранилище документов master-slave, использует Kafka для своей внутренней репликации (хозяева пишут в Kafka, ведомые потребляют из нее).
  • Venice, производное хранилище данных типа «ключ-значение», использует Kafka в качестве транспортного механизма для создания данных из Hadoop и Samza и их использования в узлах хранения Venice. Venice использует Kafka для передачи данных между центрами обработки данных и даже в качестве долгосрочного источника достоверной информации для повторной начальной загрузки данных при расширении или перебалансировке кластера.
  • Galena, поисковый индекс, использует Kafka для поддержания своих индексов в реальном времени в актуальном состоянии.
  • Liquid, графовая база данных, использует Kafka для поддержания своего индекса в актуальном состоянии.
  • Pinot, магазин OLAP, использует Kafka для обновления своих таблиц с форматированием столбцов.
  • Brooklin, система регистрации изменений, отслеживает изменения строк в Espresso и Oracle и публикует эти изменения в Kafka для последующих потребителей. Brooklin поддерживает как обновленные потребители, так и загрузочные потребители, которые массово загружают целые моментальные снимки таблицы.
  • Самза так много использует Кафку, что заслуживает отдельного раздела.

Потоковая обработка

Как упоминалось выше, Samza — это платформа обработки потоков, используемая в LinkedIn. Он использует Kafka различными способами:

  • Samza может потреблять данные из необработанных тем Kafka, а также из потоков Brooklin (которые, как упоминалось ранее, используют специальные темы Kafka).
  • Samza выводит результаты своих вычислений либо в необработанные темы Kafka, либо в магазины Venice (которые также используют темы Kafka специального назначения). Задания Samza могут быть многоэтапными, и каждый этап передает данные на следующий нижестоящий этап через Kafka.
  • Наконец, еще один способ, с помощью которого Samza использует Kafka, заключается в долговечности своего локального состояния, что позволяет заданиям Samza с отслеживанием состояния быть устойчивыми к аппаратным сбоям, поскольку состояние может быть автоматически восстановлено в новом экземпляре путем его начальной загрузки из Kafka.

Варианты использования, выполняемые Samza, очень разнообразны: push-уведомления и электронные письма участникам, анализ скорости сайта, вычисление рейтинга кликов по объявлениям, обнаружение мошенничества, стандартизация конвейеров машинного обучения и многое другое.

Обмен сообщениями между процессами

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