Проектная лаборатория
Собственная Kafka
Этап 03 · Основные этапы
Разбор идентификатора корреляции
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы замените жёстко заданный идентификатор корреляции настоящим идентификатором из запроса.
Структура сообщения Kafka
Напомним формат сообщений запросов и ответов Kafka:
message_size: размер заголовка и тела.- Заголовок: метаданные запроса.
- Тело: сами данные запроса.
На предыдущем этапе вы отправляли ответ с фиксированным correlation_id. Теперь вы извлечёте настоящий correlation_id из заголовка входящего запроса и вернёте его в ответе.
Разбор заголовка запроса
Чтобы извлечь correlation_id, нужно разобрать заголовок запроса. На этом этапе используется заголовок запроса v2.
Его структура:
| Поле | Тип данных | Размер (байты) | Описание |
|---|---|---|---|
request_api_key |
INT16 |
2 | Ключ API запроса |
request_api_version |
INT16 |
2 | Версия API запроса |
correlation_id |
INT32 |
4 | Уникальный идентификатор запроса |
client_id |
NULLABLE_STRING |
Переменный | Идентификатор клиента запроса |
TAG_BUFFER |
TAGGED_FIELDS |
Переменный | Необязательные поля с тегами |
Подробнее о типах данных см. Примитивные типы протокола.
Чтобы получить поле correlation_id, нужно определить его смещение в сообщении запроса. Пример запроса с расположением полей:
00 00 00 23 // message_size: 35
00 12 // request_api_key: 18
00 04 // request_api_version: 4
6f 7f c6 61 // correlation_id: 1870644833
...Структура ответа остаётся такой же, как на предыдущем этапе:
00 00 00 00 // message_size: 0 (any value works for this stage)
6f 7f c6 61 // correlation_id: 1870644833 (extracted from request)Тесты
Тестирующая система запустит вашу программу следующим образом:
$ ./your_program.shЗатем подключится к брокеру на порту 9092 и отправит запрос с заголовком запроса v2:
$ echo -n "00000023001200046f7fc66100096b61666b612d636c69000a6b61666b612d636c6904302e3100" | xxd -r -p | nc localhost 9092 | hexdump -CБрокер должен извлечь идентификатор корреляции из запроса и вернуть его в ответе:
00 00 00 00 // message_size: 0 (any value works for this stage)
6f 7f c6 61 // correlation_id: 1870644833Примечания
- Пока не нужно разбираться, что именно запрашивает клиент. Вы займётесь этим позже.
- На этом этапе тестирующая система проверяет только длину поля
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 wa6Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.