Проектная лаборатория
Собственная Kafka
Этап 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 go2. Откройте папку в IDE
cd ./my-kafkaРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage pv1Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.