Проектная лаборатория
Собственная Kafka
Этап 04 · Основные этапы
Разбор версии API
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы разберёте поле request_api_version в заголовке запроса и вернёте код ошибки, если версия недопустима.
API Kafka
Каждый запрос Kafka — вызов API. Протокол Kafka определяет более 70 разных API, каждый со своим назначением. Например:
Produce: записывает события в разделы.CreateTopics: создаёт новые топики.ApiVersions: возвращает поддерживаемые брокером версии API.
Запрос Kafka указывает вызываемый API в поле заголовка request_api_key.
Тело сообщения
Напомним формат запросов и ответов Kafka:
message_size.- Заголовок.
- Тело.
До сих пор вы работали только с message_size и заголовком. Теперь начнёте работать с телом сообщения.
Каждый API определяет схемы тел своих запросов и ответов.
Например, тело запроса Produce API содержит такие поля:
- Имя топика для записи.
- Ключ раздела для записи.
- Данные события для записи.
Тело ответа Produce содержит коды результатов, указывающие, успешна ли каждая запись.
Версии API
Каждый API поддерживает несколько версий, позволяя схемам изменяться со временем. Версионирование работает так:
- Запрос указывает свою версию в поле заголовка
request_api_version. - Если версия поддерживается, ответ использует ту же версию. Например, на
Produce Request (Version: 3)должен прийтиProduce Response (Version: 3). - История версий каждого API независима.
Produce (Version: 10)не связан сFetch (Version: 10).
API ApiVersions
API ApiVersions возвращает поддерживаемые брокером версии API. Например, он может сообщить о поддержке Produce версий 5-11, Fetch версий 0-3 и т. д.
На этом этапе вы начнёте добавлять поддержку ApiVersions версии 4. Пока достаточно поля error_code; остальные поля вы реализуете позже.
Поле error_code
Тело ответа ApiVersions начинается с 16-битного целого числа со знаком — error_code. Оно указывает, произошла ли ошибка при обработке запроса. Если ошибки нет, значение равно 0. Все возможные значения перечислены в таблице кодов ошибок.
На этом этапе нужно обработать только код 35 (UNSUPPORTED_VERSION). Эта ошибка возникает, когда клиент запрашивает неподдерживаемую брокером версию ApiVersions. Можно считать, что брокер поддерживает версии 0-4.
Тесты
Тестирующая система запустит вашу программу следующим образом:
$ ./your_program.shЗатем подключится к брокеру на порту 9092 и отправит запрос ApiVersions с неподдерживаемой версией:
$ echo -n "000000230012674a4f74d28b00096b61666b612d636c69000a6b61666b612d636c6904302e3100" | xxd -r -p | nc localhost 9092 | hexdump -CЗапрос выглядит так:
00 00 00 23 // message_size: 35
00 12 // request_api_key: 18
67 4a // request_api_version: 26442
4f 74 d2 8b // correlation_id: 1333056139
...Брокер должен вернуть ответ ApiVersions версии 4 с полем error_code, равным 35:
00 00 00 00 // message_size: 0 (any value works)
4f 74 d2 8b // correlation_id: 1333056139
00 23 // error_code: 35Для допустимой версии (0-4) брокер должен возвращать код ошибки 0, хотя на этом этапе это не проверяется.
Примечания
- API протокола Kafka отличаются от основных API Kafka. Основные API — более высокоуровневые интерфейсы Java и Scala, оборачивающие протокол Kafka.
- Можно считать, что тестирующая система отправляет только запросы
ApiVersions. Проверять полеrequest_api_keyв заголовке не нужно. - На этом этапе тестирующая система проверяет только длину поля
message_size— 4 байта, но не его значение. Правильные значенияmessage_sizeвы реализуете позже.
Проверка в вашей IDE
Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.
Настройка проекта и IDE
1. Создайте проект один раз
node '/opt/graphlms/tools/project-lab/cli.mjs' init kafka ./my-kafka --language go2. Откройте папку в IDE
cd ./my-kafkaРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage nc5Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.