Проснувшись однажды утром от тревожных снов, я обнаружил, что спрашиваю себя, почему я никогда не пытался использовать 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
Я буду использовать пакет поставщика (@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