Сегодня рассмотрим, что такое KafkaJS, как это связано с Apache Kafka и JavaScript, в чем преимущества этой технологии и как разработчику распределенных приложений потоковой аналитики больших данных использовать ее на практике. Также вас ждет краткий ликбез по Node.js и примеры разработки KafkaJS-приложения.
Краткий ликбез по Node.js
Важными достоинствами архитектуры потоковой передачи событий на основе Apache Kafka является слабая связанность интегрируемых систем разделения и возможность выбора наиболее подходящего инструмента для решения отдельных задач. При том, что в большинстве кейсов из области Big Data нужна разработка stateful-приложений с запросом состояния потоков Kafka на основе Java, иногда требуется более легкий подход в сценариях развертывания на периферии или бессерверных функциях [1]. Именно это характерно для технологии Node.js – программной платформы на базе высокопроизводительного JavaScript-движка V8 от Google. Node.js транслирует программу на JavaScript в машинный код, превращая его из узкоспециализированного языка разработки веб-приложений в язык общего назначения. Благодаря собственному API, написанном на C++, Node.js позволяет JavaScript взаимодействовать с устройствами ввода-вывода и подключать внешние библиотеки. Чаще всего Node.js применяется на сервере, выполняя роль веб-сервера, но может также использоваться для разработки десктопных GUI-приложений и программирования микроконтроллеров с помощью соответствующих фреймворков. Node.js основан на событийно-ориентированном и асинхронном (реактивном) программировании с неблокирующим вводом/выводом [2].
Сегодня Node.js считается одним из самых популярных средств построения эффективных и масштабируемых REST API, позволяя разрабатывать десктопные и мобильные приложения, а также ПО для интернета вещей IoT. Используя событийно-ориентированную архитектуру с отсутствием блокировок ввода/вывода, Node.js представляет собой среду выполнения JavaScript, а не просто фреймворк или библиотеку. JavaScript-программа является однопоточной, т.е. быстрота ее работы обеспечивается за счет отсутствия переключения контекста. При этом в Node.js неблокирующий ввод-вывод реализован путём запуска отдельных потоков, таких как работа с файлами и сетью, через средства операционной системы. А для выполнения ресурсоемких вычислительных операций есть специальные потоки-worker’ы в модуле worker_threads, которые позволяют распараллелить вычисления [3].
Таким образом, Node.js дает возможность быстрее запускать приложения на меньших ресурсах. Это довольно востребовано в IoT-кейсах, где также активно применяется Apache Kafka. А событийно-ориентированная архитектура этой Big Data платформы близка концепции Node.js. Поэтому в 2018 года сообщество ИТ-специалистов с поддержкой компании Confluent, которая занимается развитием и коммерциализацией Apache Kafka, разработали open-source проект под названием KafkaJS. Разработчики подчеркивают, что KafkaJS выпускается под лицензией MIT и никак не связана с Apache Software Foundation. Что именно представляет собой эта технология и зачем она нужна, мы рассмотрим далее.
Что такое KafkaJS и как он работает с Apache Kafka
KafkaJS представляет собой клиент Apache Kafka для Node.js, совместимый с Kafka 0.10+ и встроенной поддержкой функций 0.11. Это полная реализация клиента Kafka на чистом JavaScript без каких-либо зависимостей, что дает преимущества небольшого размера и простого развертывания с удобным для использования API. Хотя KafkaJS всегда был независимым проектом, он используется в качестве базовой технологии для поддержки других фреймворков, таких как NestJS и n8n [1]. KafkaJS поддерживает следующие функции Apache Kafka [4]:
- продюсер;
- группы потребителей с паузой, возобновлением и поиском;
- транзакционная поддержка продюсеров и потребителей;
- заголовки сообщений;
- GZIP-сжатие;
- сжатие Snappy, LZ4 и ZSTD с помощью подключаемых кодеков
- реализация некоторых криптографических протоколов (Plain, SSL и SASL_SSL);
- механизмы аутентификации SCRAM-SHA-256 и SCRAM-SHA-512, а также AWS IAM;
- клиентский API администратора (Admin client), о котором мы писали здесь.
Apache Kafka для инженеров данных
Код курса
DEVKI
Ближайшая дата курса
3 марта, 2025
Продолжительность
24 ак.часов
Стоимость обучения
72 000 руб.
Также KafkaJS включает пакетирование, транзакции, интеграцию реестра Confluent Schema Registry и другие возможности для разработки IoT-решений и распределенных приложений потоковой аналитики больших данных. Чтобы понять, как использовать этот инструмент, рассмотрим начало работы с KafkaJS. Первым шагом является настройка подключения к Apache Kafka. KafkaJS состоит из клиентского класса, который можно использовать для создания экземпляров потребителей, производителей и администраторов. Однако, прежде всего следует установить Node.js (новее версии 12) и запустить кластер Kafka (локальный или в облаке, например, Confluent Cloud) [1]. Далее следует установить KafkaJS с помощью менеджера пакетов YARN или npm, запустив команду yarn add kafkajs или npm install kafkajs. Затем можно создать экземпляр клиента KafkaJS, подключив его к хотя бы одному брокеру [4]:
const { Kafka } = require('kafkajs') const { KAFKA_USERNAME: username, KAFKA_PASSWORD: password } = process.env const sasl = username && password ? { username, password, mechanism: 'plain' } : null const ssl = !!sasl
В приведенном выше примере выполняется подключение с использованием TLS и SASL/простой проверки подлинности, если установлены переменные среды KAFKA_USERNAME и KAFKA_PASSWORD. В случае локального Kafka-кластера без TLS и аутентификации, эти переменные среды следует просто опустить для подключения без TLS и аутентификации. Параметр ssl можно использовать для настройки сокетов TLS. Параметры передаются непосредственно в tls.connect и используются для создания безопасного контекста TLS. Опцию sasl можно использовать для настройки механизма аутентификации. KafkaJS поддерживает механизмы PLAIN, SCRAM-SHA-256, SCRAM-SHA-512 и AWS. Важно, что брокер Kafka может быть настроен на отклонение пользовательской попытки аутентификации без TLS, даже если сами учетные данные действительны. Поэтому рекомендуется всегда использовать TLS при выборе PLAIN в качестве механизма аутентификации, который передает учетные данные в незашифрованном виде как простой текст [5].
Закончив с настройкой защищенного подключения к кластеру Kafka, можно разработать JavaScript-файлы, реализующие продюсера и потребителя сообщений, которые будут записывать данные в топики и считывать их оттуда соответственно. Следующий код показывает простейший пример использования KafkaJS [4]:
//создаем экземпляр клиента KafkaJS и подключается к Kafka-брокеру const { Kafka } = require('kafkajs') const kafka = new Kafka({ clientId: 'my-app', brokers: ['kafka1:9092', 'kafka2:9092'] }) const producer = kafka.producer() const consumer = kafka.consumer({ groupId: 'test-group' }) const run = async () => { //продюсер записывает сообщения в топик Kafka await producer.connect() await producer.send({ topic: 'test-topic', messages: [ { value: 'Hello KafkaJS user!' }, ], }) //потребитель считывает сообщения из топика Kafka await consumer.connect() await consumer.subscribe({ topic: 'test-topic', fromBeginning: true }) await consumer.run({ eachMessage: async ({ topic, partition, message }) => { console.log({ partition, offset: message.offset, value: message.value.toString(), }) }, }) } run().catch(console.error)
Другой пример программного кода приведен в источнике [1]. А в нашей новой статье мы рассказываем про реализацию двух инструментов мониторинга за состоянием Kafka-кластера на базе KafkaJS и системы мониторинга с базой данных временных рядов Prometheus.
Освоить на практике все администрирования и эксплуатации Apache Kafka для разработки распределенных приложений потоковой аналитики больших данных вы сможете на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
Источники