Apache Kafka — это распределенное хранилище событий и платформа потоковой обработки . Это система с открытым исходным кодом , разработанная Apache Software Foundation, написанная на Java и Scala . Цель проекта — предоставить унифицированную, высокопроизводительную, малозадерживаемую платформу для обработки потоков данных в реальном времени. Kafka может подключаться к внешним системам (для импорта/экспорта данных) через Kafka Connect и предоставляет библиотеки Kafka Streams для приложений потоковой обработки. Kafka использует двоичный протокол на основе TCP , оптимизированный для эффективности и опирающийся на абстракцию «набора сообщений», которая естественным образом группирует сообщения вместе, чтобы сократить накладные расходы на сетевой цикл. Это «приводит к более крупным сетевым пакетам, более крупным последовательным дисковым операциям, непрерывным блокам памяти [...], что позволяет Kafka преобразовывать прерывистый поток случайных записей сообщений в линейные записи». [4]
Kafka изначально была разработана в LinkedIn , а затем в начале 2011 года ее исходный код был открыт. Джей Крепс, Неха Наркхеде и Джун Рао помогали в создании Kafka. [5] Выпуск из Apache Incubator состоялся 23 октября 2012 года. [6] Джей Крепс решил назвать программное обеспечение в честь автора Франца Кафки, потому что это «система, оптимизированная для письма», и ему нравились работы Кафки. [7]
Apache Kafka основан на журнале коммитов и позволяет пользователям подписываться на него и публиковать данные в любом количестве систем или приложений реального времени. Примеры приложений включают управление сопоставлением пассажиров и водителей в Uber , предоставление аналитики в реальном времени и предиктивного обслуживания для умного дома British Gas , а также выполнение многочисленных услуг в реальном времени по всему LinkedIn. [8]
Kafka хранит сообщения типа «ключ-значение», которые поступают из произвольного количества процессов, называемых производителями . Данные могут быть разделены на различные «разделы» в пределах различных «тем». Внутри раздела сообщения строго упорядочены по их смещениям (положению сообщения в разделе), индексируются и хранятся вместе с меткой времени. Другие процессы, называемые «потребителями», могут читать сообщения из разделов. Для потоковой обработки Kafka предлагает API потоков, который позволяет писать приложения Java, которые потребляют данные из Kafka и записывают результаты обратно в Kafka. Apache Kafka также работает с внешними системами потоковой обработки, такими как Apache Apex , Apache Beam , Apache Flink , Apache Spark , Apache Storm и Apache NiFi .
Kafka работает на кластере из одного или нескольких серверов (называемых брокерами), а разделы всех тем распределены по узлам кластера. Кроме того, разделы реплицируются на несколько брокеров. Эта архитектура позволяет Kafka доставлять массивные потоки сообщений отказоустойчивым образом и позволила ему заменить некоторые из традиционных систем обмена сообщениями, такие как Java Message Service (JMS), Advanced Message Queuing Protocol (AMQP) и т. д. Начиная с версии 0.11.0.0, Kafka предлагает транзакционные записи , которые обеспечивают обработку потоков exact-once с использованием Streams API.
Kafka поддерживает два типа тем: обычные и сжатые. Обычные темы можно настроить с указанием времени хранения или ограничения пространства. Если есть записи, которые старше указанного времени хранения или если ограничение пространства превышено для раздела, Kafka разрешается удалять старые данные, чтобы освободить место для хранения. По умолчанию темы настроены со временем хранения 7 дней, но также возможно хранить данные неограниченно долго. Для сжатых тем записи не устаревают в зависимости от времени или ограничений пространства. Вместо этого Kafka рассматривает более поздние сообщения как обновления более ранних сообщений с тем же ключом и гарантирует, что никогда не удалит последнее сообщение для каждого ключа. Пользователи могут полностью удалить сообщения, написав так называемое сообщение-надгробие с нулевым значением для определенного ключа.
В Kafka есть пять основных API:
API-интерфейсы потребителя и производителя отделены от основной функциональности Kafka через базовый протокол обмена сообщениями . Это позволяет писать совместимые слои API на любом языке программирования, которые столь же эффективны, как API-интерфейсы Java, входящие в комплект Kafka. Проект Apache Kafka поддерживает список таких сторонних API.
Kafka Connect (или Connect API) — это фреймворк для импорта/экспорта данных из/в другие системы. Он был добавлен в релизе Kafka 0.9.0.0 и использует API Producer и Consumer внутри себя. Сам фреймворк Connect выполняет так называемые «коннекторы», которые реализуют фактическую логику для чтения/записи данных из других систем. Connect API определяет программный интерфейс, который должен быть реализован для создания пользовательского коннектора. Многие коннекторы с открытым исходным кодом и коммерческие коннекторы для популярных систем данных уже доступны. Однако сам Apache Kafka не включает готовые к производству коннекторы.
Kafka Streams (или Streams API) — это библиотека потоковой обработки, написанная на Java. Она была добавлена в выпуске Kafka 0.10.0.0. Библиотека позволяет разрабатывать приложения потоковой обработки с сохранением состояния, которые являются масштабируемыми, эластичными и полностью отказоустойчивыми. Основной API — это язык домена потоковой обработки (DSL), который предлагает высокоуровневые операторы, такие как фильтр, отображение , группировка, работа с окнами, агрегация, объединения и понятие таблиц. Кроме того, API процессора можно использовать для реализации пользовательских операторов для более низкоуровневого подхода к разработке. DSL и API процессора также можно смешивать. Для потоковой обработки с сохранением состояния Kafka Streams использует RocksDB для поддержания локального состояния оператора. Поскольку RocksDB может записывать на диск, поддерживаемое состояние может быть больше доступной основной памяти. Для обеспечения отказоустойчивости все обновления локальных хранилищ состояний также записываются в тему в кластере Kafka. Это позволяет воссоздать состояние, читая эти темы и отправляя все данные в RocksDB. Последняя версия Streams API — 2.8.0. [9] Ссылка также содержит информацию о том, как обновиться до последней версии. [10]
До версии 0.9.x брокеры Kafka обратно совместимы только со старыми клиентами. Начиная с Kafka 0.10.0.0 брокеры также совместимы с более новыми клиентами. Если более новый клиент подключается к старому брокеру, он может использовать только те функции, которые поддерживает брокер. Для API Streams полная совместимость начинается с версии 0.10.1.0: приложение Kafka Streams 0.10.1.0 несовместимо с 0.10.0 или более старыми брокерами.
Мониторинг сквозной производительности требует отслеживания метрик от брокеров, потребителей и производителей, в дополнение к мониторингу ZooKeeper , который Kafka использует для координации между потребителями. [11] [12] В настоящее время существует несколько платформ мониторинга для отслеживания производительности Kafka. В дополнение к этим платформам сбор данных Kafka также может выполняться с помощью инструментов, обычно связанных с Java, включая JConsole . [13]
Люди часто спрашивают, как Kafka получил свое название и связано ли это как-то с самим приложением. Джей Крепс высказал следующее мнение: «Я подумал, что поскольку Kafka — это система, оптимизированная для письма, имя писателя будет иметь смысл. Я посещал много занятий по литературе в колледже и мне нравился Франц Кафка».