Проектная лаборатория

Собственная Kafka

0 / 25этапов пройдено

Этап 05 · Основные этапы

Обработка запросов ApiVersions

Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.

На этом этапе вы реализуете тело ответа на запрос ApiVersions.

API ApiVersions: повторение

Напомним: API ApiVersions возвращает поддерживаемые брокером версии API. Ответ содержит список API с минимальной и максимальной поддерживаемыми версиями каждого.

Мы создали интерактивный обозреватель протокола, чтобы помочь вам наглядно изучить структуру запросов и ответов:

Тело ответа ApiVersions

Тело ответа ApiVersions (v4) имеет следующую структуру:

Поле Тип данных Описание
error_code INT16 Код ошибки (0 для успешных запросов)
api_keys COMPACT_ARRAY Массив поддерживаемых API с диапазонами версий
throttle_time_ms INT32 Время ограничения скорости в миллисекундах
TAG_BUFFER TAGGED_FIELDS Необязательные поля с тегами

Каждая запись массива api_keys содержит:

Поле Тип данных Описание
api_key INT16 Идентификатор API
min_version INT16 Минимальная поддерживаемая версия
max_version INT16 Максимальная поддерживаемая версия
TAG_BUFFER TAGGED_FIELDS Необязательные поля с тегами

На этом этапе ответ должен содержать как минимум одну запись с ключом API 18 (ApiVersions), min_version, равным 0, и max_version, равным 4.

Пример возможного ответа:

00 00 00 13  // message_size:      19 bytes
ab cd ef 12  // correlation_id:    (matches request)
00 00        // error_code:        0 (no error)
02           // api_keys array length:    1 element
00 12        // api_key:           18 (ApiVersions)
00 00        // min_version:       0
00 04        // max_version:       4
00           // TAG_BUFFER:        empty
00 00 00 00  // throttle_time_ms:  0
00           // TAG_BUFFER:        empty

Это первый этап, на котором проверяется значение message_size. Например, если заголовок ответа занимает 4 байта, а тело — 15, поле message_size должно быть равно 19.

Тесты

Тестирующая система запустит вашу программу следующим образом:

$ ./your_program.sh

Затем подключится к серверу на порту 9092 и отправит корректный запрос ApiVersions (v4):

$ echo -n "0000001a0012000467890abc00096b61666b612d636c69000a6b61666b612d636c6904302e3100" | xxd -r -p | nc localhost 9092 | hexdump -C

Запрос выглядит так:

00 00 00 1a  // message_size:        26
00 12        // request_api_key:     18 (ApiVersions)
00 04        // request_api_version: 4
67 89 0a bc  // correlation_id:      1737034428
...          // rest of header and body

При проверке ответа тестирующая система убедится, что:

  • Поле message_size правильно отражает размер заголовка и тела.
  • Идентификатор корреляции в заголовке ответа совпадает с идентификатором в заголовке запроса.
  • Поле error_code в теле ответа равно 0.
  • Ответ содержит запись с ключом API 18 (ApiVersions), где min_version равно 0, а max_version — 4.
  • После декодирования всех полей ответа не остаётся лишних байтов.

Примечания

  • Тестирующая система всегда отправляет запрос ApiVersions версии v4.
  • Начиная с этого этапа, помимо остальных проверок, тестирующая система проверяет первые 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 go

2. Откройте папку в IDE

cd ./my-kafka

Реализуйте требования этапа в созданном проекте.

Запустите из папки проекта

node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage pv1

Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.

Результат проверки

go / ЛОКАЛЬНО

Подключение к локальной проверке…

Здесь появится результат

Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.

GraphLMS — инженерная лаборатория роста