Что такое 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
Ближайшая дата курса
24 января, 2022
Длительность обучения
32 ак.часов
Стоимость обучения
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