Что такое KafkaJS: как скрестить ежа с ужом, а Apache Kafka с Node.js

Что такое KafkaJS: как скрестить ежа с ужом, а Apache Kafka с Node.js

Сегодня рассмотрим, что такое 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
Ближайшая дата курса
2 февраля, 2026
Продолжительность
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 в Москве:

Источники

  1. https://www.confluent.io/blog/getting-started-with-kafkajs/
  2. https://ru.wikipedia.org/wiki/Node.js
  3. https://habr.com/ru/post/460661/
  4. https://github.com/tulios/kafkajs
  5. https://kafka.js.org/docs/getting-started
Изменение базового тарифа с 1 января 2026 года Подробнее