Kafka на бессерверном берегу: Создание событийно-управляемых приложений с помощью Kafka

Проснувшись однажды утром от тревожных снов, я обнаружил, что спрашиваю себя, почему я никогда не пытался использовать Apache Kafka.

Будучи энтузиастом событийно-управляемых приложений и учитывая недавние анонсы Amazon Managed Streaming for Apache Kafka (MSK) Serverless и предложения Serverless Kafka от Upstash, я решил попробовать еще раз.

В прошлом я немного поиграл на компьютере, но только для того, чтобы перейти к производству. Признаюсь, это было выше моих сил в свободное время. И тут на помощь приходит serverless! Это один из самых продаваемых пунктов «не нужно думать о серверах», можно просто экспериментировать с новыми технологиями.

Поскольку предложение AWS находится в стадии публичной предварительной версии, а не General Available, я выбрал предложение Upstash’s Kafka Serverless.

Что такое Kafka?

Я подумал, что поскольку Kafka — это система, оптимизированная для работы с письмами, то использование имени писателя будет вполне логичным. В колледже я изучал много литературы и мне нравился Франц Кафка. Кроме того, название звучало круто для проекта с открытым исходным кодом.
Так что, по сути, здесь нет особой связи.
Джей Крепс, соавтор Apache Kafka на Quora

Kafka — это система обмена сообщениями публикация/подписка. По-другому ее можно описать как «распределенный журнал фиксации» или, в наши дни, как «распределенную потоковую платформу».

Основной сущностью Kafka является сообщение. Для всех целей Kafka не заботится о содержании сообщения. Это просто массив байтов. Сообщения также могут опционально иметь ключ. Kafka постоянно хранит сообщения в определенном порядке. Можно воспроизвести поток, чтобы узнать состояние системы в определенный момент времени. Машина времени для ваших транзакций.

Темы — это способ категоризации сообщений для того, чтобы другие приложения могли иметь некоторое представление о том, к каким сообщениям они будут иметь доступ.

И затем, сердце системы: Производители и Потребители. По сути, первые, также называемые издателями или писателями, производят сообщения, обычно много сообщений, чтобы потребовать Kafka, а другие приложения действуют на основе этих сообщений. Потребители читают сообщения из темы и. Мы можем называть их также подписчиками или читателями.

Kafka — это обширная тема, достойная книг, курсов и практических занятий. Есть еще много концепций, которые я не буду рассматривать в этом посте. Это даже тема для статей, например, «Об эффективном разделении тем в Apache Kafka». Я очень рекомендую статью Apache Kafka для начинающих — What is Apache Kafka?

Преимущества бессерверного предложения в том, что накладные расходы на управление брокерами, разделами, Zookepeer и всеми другими движущимися частями, позволяющими создавать отказоустойчивые и высокораспределенные приложения, будут взяты на себя. И тогда вы можете сосредоточиться на написании нужного вам кода в вашей области, с вашими инструментами — вот что я называю радостью бессерверного подхода.

На берегу

Чтобы начать, нужно просто войти в систему, выбрать Kafka и создать наш первый кластер. Kafka с самого начала работает в распределенном режиме.

Чтобы создать кластер, нам понадобится имя и выбрать регион. А также, если нам нужно быть только в одной зоне доступности или в нескольких. Выберите однозонный для тестирования/разработки, многозонный для производственных случаев использования.

Затем мы создадим нашу первую тему и выберем желаемое количество разделов. Разделы — это то, как Kafka обеспечивает избыточность и масштабируемость, и каждый из них может жить на отдельном сервере. Это очень важно для производительности и масштабирования.

В расширенных опциях для тем будет несколько опций с чувствительными значениями по умолчанию. Некоторые конфигурации потребуют обновления вашего плана. Поэтому планируйте переход на новую версию в зависимости от потребностей вашего приложения.

И… вот и все. Не нужно беспокоиться о серверах.

В этом учебнике я буду использовать Node.js на AWS Lambda. Код доступен в этом репозитории GitHub с использованием TypeScript:

ibrahimcesar / lambda-serverless-kafka

🐚 Kafka на бессерверном берегу

Эксперименты с бессерверным Kafka от Upstash.

Читайте «Kafka на бессерверном берегу: Создание событийно-управляемых приложений с помощью Kafka для контекста.

Развертывание

Вам понадобятся:

  • Учетная запись AWS
  • Установленный CDK v2 (npm install -g aws-cdk)
  • CDK boostraped в учетной записи / регионе, в котором мы будем развертывать
  • Пользователь для развертывания CDK с нужными правами.

Если вам нужна помощь со всем вышеперечисленным, откройте Issue, чтобы узнать, достаточно ли людей заинтересовано в учебнике по этому вопросу.

npm install
cp .env.example .env

Заполните .env своими учетными данными и именами.

cdk deploy

Не забудьте, если у вас несколько профилей AWS в вашей машине, передать флаг:

cdk deploy --profile namedProfile

Bootstraped with my CDK v2 Simple Lambda HTTP ApiGateway Starter

Посмотреть на GitHub

Я буду использовать пакет поставщика (@upstash/kafka), который использует REST API. Поскольку мы находимся на берегу, мы не будем выходить в открытое море и строить корабль. Даже лодку не будем строить. Мы просто намочим наши ноги.

Я пишу приложение, которое будет читать что-то, от какого-то автора. И постит каждую строчку в Kafka. А потом, после этого, я буду потреблять.

По сути, это просто две ламбды, по одной для каждой конечной точки: писатель и читатель.

И мы будем использовать мою тему ulysses. Я могу отправить все строки с номерами страниц из книги «Улисс» Джеймса Джойса. Или данные аналитики. Или данные журнала. Суть вы уловили.

// This is just a edited. 
// View full file at: 
// https://github.com/ibrahimcesar/lambda-serverless-kafka/blob/main/src/lambda/producer.ts

import { Kafka } from "@upstash/kafka";

const kafka = new Kafka({
  // configuration
});
const writer = kafka.producer();

try {
    const res = await writer.produce("ulysses", writing, {
      key: payload.author ?? "",
    });
    response = res;
  } catch (err) {
    if (err instanceof Error) throw err;
    else throw new Error(`${err}`);
  }
Вход в полноэкранный режим Выйти из полноэкранного режима

А потреблять очень просто. Обратите внимание, что у меня там два жестко закодированных значения, consumerGroupId и instanceId. Вы, в принципе, можете отправить все, что хотите, в первом запросе, и Upstash обеспечит вас всем необходимым.

// Try and catch block. 
// View full file at: 
// https://github.com/ibrahimcesar/lambda-serverless-kafka/blob/main/src/lambda/consumer.ts

  try {
    const writing = await reader.consume({
      consumerGroupId: "group_1",
      instanceId: "instance_1",
      topics: payload.topics,
      autoOffsetReset: payload.autoOffsetReset ?? "earliest",
    });
    response = writing;
  } catch (err) {
    console.error(err);
    if (err instanceof Error) throw err;
    else throw new Error(`${err}`);
  }
Вход в полноэкранный режим Выход из полноэкранного режима

Маленький лайфхак на TypeScript. Я использую флаг useUnknownInCatchVariables: true в файле tsconfig.json, поэтому catch имеет тип unknown. Спасибо Майку Норту за подсказку.

А теперь мы можем начать писать и читать. Для записи достаточно просто POST.

Конечная согласованность

Для чтения мы используем еще один POST, но берегитесь: здесь есть кое-что важное о распределенных системах. У нас есть конечная согласованность. Это означает, что ваше приложение не может полагаться на то, что данные будут доступны вам сразу после записи. В этом случае вы можете получить… ничего, например, пустой массив:

Но, спустя совсем немного времени, вы сможете увидеть все данные, доступные в теме:

Dive Deep

  • Ознакомьтесь с документами Upstash по Kafka.
  • Станьте читателем: Kafka: The Definitive Guide: Данные в реальном времени и потоковая обработка в масштабе
  • Ознакомьтесь с материалами Confluent по Kafka.
  • AWS только что выпустила MKS Serveless, управляемый стриминг для Apache Kafka (MSK). Но обратите внимание, что, хотя это бессерверное предложение в том смысле, что вам не нужно будет беспокоиться о серверах кластера, как они говорят: «Легко обрабатывать потоковые данные с помощью Amazon MSK без управления мощностями кластера». Подчеркнуто мной. Вам придется приложить гораздо больше усилий, чем в предложении Upstash, как вы можете видеть здесь: Начало работы — Шаг 2: Создание клиентской машины
  • Весь используемый код открыт для использования в TypeScript, с использованием AWS Cloud Developement Kit (CDK). Поэтому у вас не возникнет никаких проблем с созданием инфраструктуры.

Изображение на обложке: Alejandro Cartagena на Unsplash

Оцените статью
Procodings.ru
Добавить комментарий