Проектная лаборатория
Собственный Redis
Этап 32 · Репликация
Приём рукопожатия (2/2)
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы добавите приём команды PSYNC от реплики.
Напоминание о рукопожатии
При рукопожатии ведущий получает:
PINGот реплики.- Дважды
REPLCONFот реплики. PSYNCот реплики.
После двух REPLCONF реплика отправляет ведущему команду PSYNC с аргументами ? -1:
- Идентификатор репликации равен
?, поскольку реплика ещё не знает идентификатор ведущего. - Смещение равно
-1, поскольку данных от ведущего ещё нет.
Полученная команда будет выглядеть примерно так:
*3\r\n$5\r\nPSYNC\r\n$1\r\n?\r\n$2\r\n-1\r\nЭто ["PSYNC", "?", "-1"], закодированный как массив RESP.
Ведущий должен ответить +FULLRESYNC <REPL_ID> 0\r\n — строкой FULLRESYNC <REPL_ID> 0 в формате простой строки. Значение ответа:
FULLRESYNCозначает, что ведущий не может выполнить инкрементальное обновление реплики и начнёт полную повторную синхронизацию.<REPL_ID>— идентификатор репликации ведущего.0— смещение репликации ведущего.
Например, для идентификатора 8371b4fb1155b71f4a04d3e1bc3e18c4a990aeeb ответ будет:
+FULLRESYNC 8371b4fb1155b71f4a04d3e1bc3e18c4a990aeeb 0\r\nТесты
Тестирующая программа запустит вашу программу так:
./your_program.sh --port <PORT>Затем подключится к TCP-серверу как реплика и отправит:
PING— ожидается+PONG\r\n.REPLCONF listening-port <PORT>— ожидается+OK\r\n.REPLCONF capa psync2— ожидается+OK\r\n.PSYNC ? -1— ожидается+FULLRESYNC <REPL_ID> 0\r\n.
Примечания
- Вместо
<REPL_ID>подставьте идентификатор репликации ведущего, инициализированный ранее.
Проверка в вашей IDE
Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.
Настройка проекта и IDE
1. Создайте проект один раз
node '/opt/graphlms/tools/project-lab/cli.mjs' init redis ./my-redis --language go2. Откройте папку в IDE
cd ./my-redisРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage vm3Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.