Участник:Raneddo/Черновик/Архив/Apache Kafka
Raneddo/Черновик/Архив/Apache Kafka |
---|
Apache Kafka — это распределённый программный брокер сообщений с открытым исходным кодом, разработанный Apache Software Foundation на языках Java и Scala. Целью проекта является создание платформы для обработки потоковых данных в реальном времени с высокой пропускной способностью и низкой задержкой. Kafka может подключаться к внешним системам (для импорта/экспорта данных) через Kafka Connect, а также может использоваться в задачах больших данных при помощи библиотеки Kafka Streams. Kafka использует собственный бинарный протокол передачи данных на основе TCP, оптимизированный под эффективность и опирающийся на абстракцию «множество сообщений», которая группирует сообщения, уменьшая накладные расходы на сеть.
История
[править | править код]Изначально Kafka была разработана в LinkedIn для внутреннего использования, но в начале 2011 года разработчики открыли исходный код системы под разрешительной лицензией Apache. Первыми разработчиками системы были Джей Крепс, Неха Нархеде[англ.] и Джун Рао[1]. Как и все системы, которые должны стать полноценными проектами Apache Software Foundation, Kafka ещё некоторое время находилась под крылом Apache Incubator. Релиз вне инкубатора состоялся 23 октября 2012 года под именем Apache Kafka.[2] Разработчик Джей Крепс дал такое название системе в честь автора Франца Кафки, описывая систему как «система, оптимизированная для записи».[3]
Архитектура
[править | править код]Kafka хранит сообщения, которые поступают от других процессов называемых «производители» (producers), в формате ключ-значение. Данные могут быть разделены на разные «партиции» (partitions) в рамках разных «топиков» (topic). Внутри партиции сообщения строго упорядочены по их смещениям (offset) (положению сообщения внутри раздела), а также индексируются и сохраняются вместе с временем создания. Другие процессы, называемые «потребителями» (consumers), могут считывать сообщения из разделов. Для потоковой обработки Kafka предлагает Streams API, позволяющий писать Java-приложения, которые потребляют данные из Kafka и записывают результаты обратно в Kafka. Apache Kafka также работает с внешними системами обработки потоков, такими как Apache Apex, Apache Beam, Apache Flink, Apache Spark, Apache Storm и Apache NiFi.
Kafka работает в кластере из одного или нескольких серверов (называемых брокерами), где партиции всех топиков распределены по узлам кластера. Для получения отказоустойчивости системы, партиции реплицируются на несколько брокеров. Это позволяет Kafka доставлять огромные потоки сообщений без угрозы потери данных. Этот подход также позволил разработчикам использовать Kafka вместо некоторых традиционных систем обмена сообщениями, таких как Java Message Service (JMS), Advanced Message Queuing Protocol (AMQP) и других. Начиная с версии 0.11.0.0, Kafka позволяет использовать транзакционную модель, сравнимую с записью в базу данных, которая обеспечивает обработку потока ровно один раз с использованием Streams API.
Kafka поддерживает два типа топиков: обычные и компактные. Обычные топики можно настроить с указанием срока хранения или ограничения по максимальному занимаемому пространству в хранилище. Kafka удаляет самые старые записи, если лимит занимаемого пространства превышен. Записи, вышедшие за срок хранения также подлежат удалению, вне зависимости от лимитов памяти. Значения в компактных топиках не содержат срока хранения и не зависят ограничений памяти, вместо этого Kafka хранит и обрабатывает только самые новые значения для каждого ключа и гарантирует, что никогда не удалит последнее сообщение для каждого ключа. Пользователи могут самостоятельно удалять сообщения, написав сообщение с пустым значением для удаления значения по ключу.
В Kafka есть пять основных API-интерфейсов:
Producer API — позволяет приложениям отправлять сообщения в брокер.
Consumer API — позволяет приложению подписываться на топики и вычитывать сообщения из брокера.
Connector API — позволяет приложение подключаться к Kafka и многократно использовать Producer API и Consumer API.
Streams API — преобразует входные потоки данных в выходные.
Admin API — используется для управления топиками Kafka, брокерами и другими объектами.
Producer API и Consumer API имеют слабую связность с основной функциональностью Kafka с помощью протокола обмена сообщениями. Благодаря слабой связности, реализации этих API возможна на любом языке программирования, без потери эффективности в сравнении с официальным Java API. Список таких клиентов, проверенных Apache Kafka содержится на сайте проекта.
Kafka API
[править | править код]Connect API
[править | править код]Kafka Connect (или Connect API) — это фреймворк для импортирования данных из других систем, а также для экспортирования данных в другие системы. Его добавили в версии Kafka 0.9.0.0. Фреймворк Connect создаёт «коннекторы», которые реализуют логику чтения и записи данных во внешние системы. Connect API определяет программный интерфейс, для реализации отдельных библиотек под различные языки программирования. На большинство крупнейших языков программирования уже есть реализации API. При этом, компания Apache Kafka не занимается разработкой таких библиотек.
Streams API
[править | править код]Kafka Streams (или Streams API) — это библиотека потоковой обработки данных, написанная на Java. Её добавили в версии Kafka 0.10.0.0. Она позволяет создавать масштабируемые и отказоустойчивые приложения потоковой обработки данных, а также для агрегации, преобразования и анализа данных, получаемых из Kafka-топиков. Это даёт возможность разработчикам создавать сложные конвейеры обработки данных, используя функциональный стиль программирования.
Kafka Streams содержит предметно-ориентированный язык потоковой обработки (DSL), который предлагает высокоуровневые операторы, такие как фильтр, отображение, группировка, управление окнами, агрегация и объединение таблиц. Кроме того, Processor API можно использовать для реализации пользовательских операторов для более низкоуровневого подхода к разработке. DSL и Processor API можно использовать совместно. Для потоковой обработки для сохранения состояния Kafka Streams использует RocksDB. Поскольку RocksDB может сохранять часть данных на диск, количество обрабатываемых данных может быть больше, чем доступная основная память. Для обеспечения отказоустойчивости все обновления локальных хранилищ также записываются в раздел в кластере Kafka. Это позволяет воссоздать состояние, прочитав эти разделы, и передать все данные в RocksDB.
Совместимость версий
[править | править код]До версии 0.9.x брокеры Kafka были обратно совместимы только с клиентами версии брокера и всех предыдущих версий. Начиная с Kafka 0.10.0.0, брокеры поддерживают совместимость с новыми клиентами. Если новый клиент подключается к более старой версии брокера, он может использовать только те функции, которые поддерживает этот брокер. Для Streams API полная совместимость начинается с версии 0.10.1.0: приложение Kafka Streams версии 0.10.1.0 несовместимо с брокерами версии 0.10.0.0 и старше.
Kafka проводит мониторинг метрик от брокеров, потребителей и производителей в дополнение к мониторингу ZooKeeper, который Kafka использует для координации между потребителями.[4][5] В настоящее время существует несколько платформ мониторинга для отслеживания производительности Kafka. Помимо этих платформ, собирать метрики из Kafka с помощью инструментов, поставляемых в комплекте с Java, включая JConsole.[6]
Примечания
[править | править код]- ↑ Li, S. (2020). He Left His High-Paying Job At LinkedIn And Then Built A $4.5 Billion Business In A Niche You’ve Never Heard Of. Forbes. Retrieved 8 June 2021, from Forbes_Kreps.
- ↑ Apache Incubator: Kafka Incubation Status .
- ↑ What is the relation between Kafka, the writer, and Apache Kafka, the distributed messaging system? Quora. Дата обращения: 12 июня 2017.
- ↑ Monitoring Kafka performance metrics (амер. англ.) (6 апреля 2016). Дата обращения: 5 октября 2016.
- ↑ Mouzakitis. Monitoring Kafka performance metrics (амер. англ.). datadoghq.com (6 апреля 2016). Дата обращения: 5 октября 2016.
- ↑ Collecting Kafka performance metrics - Datadog (амер. англ.) (6 апреля 2016). Дата обращения: 5 октября 2016.
См. также
[править | править код]- RabbitMQ
- Apache Pulsar
- Redis
- Apache Flink
- Apache Samza
- Apache Spark Streaming
- Data Distribution Service
- Enterprise Integration Patterns
- Enterprise messaging system
- Streaming analytics
- Event-driven SOA
- Hortonworks DataFlow
- Message-oriented middleware
- Service-oriented architecture
Ссылки
[править | править код]Категория:Программное обеспечение, разработанное в 2011 году Категория:Java Категория:Свободное программное обеспечение, написанное на Scala Категория:Свободное программное обеспечение Категория:Интеграция приложений предприятия Категория:Проекты Apache