Проектная лаборатория
Собственный Redis
Этап 34 · Репликация
Передача команд одной реплике
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы добавите передачу команд записи от ведущего одной реплике.
Распространение команд
После завершения рукопожатия и отправки файла RDB ведущий начинает передавать реплике команды записи.
Команды записи меняют набор данных ведущего, например SET и DEL. Команды вроде PING, ECHO и других не считаются командами записи и не передаются репликам.
Процесс передачи
Команды передаются через соединение репликации — то же соединение, которое использовалось для рукопожатия.
Команды отправляются как массивы RESP. Например, получив от клиента SET foo bar, ведущий отправит *3\r\n$3\r\nSET\r\n$3\r\nfoo\r\n$3\r\nbar\r\n всем подключённым репликам через их соединения репликации.
Реплики обрабатывают эти команды так же, как команды клиентов, с одним отличием: они не отправляют ведущему ответы. Они молча выполняют команду и обновляют своё состояние.
Ведущий тоже не ждёт ответа от реплики при передаче команды. Он отправляет команды по мере поступления.
Из правила «без ответа» есть исключение — команда REPLCONF GETACK. Её мы рассмотрим позже.
Тесты
Тестирующая программа запустит вашу программу так:
./your_program.sh --port <PORT>Затем подключится к TCP-серверу как реплика и выполнит полную последовательность рукопожатия из предыдущих этапов.
После этого она дождётся отправки файла RDB сервером.
Получив RDB, тестирующая программа отправит вашей программе серию команд записи как отдельный клиент Redis.
$ redis-cli SET foo 1
$ redis-cli SET bar 2
$ redis-cli SET baz 3Затем проверит, что команды переданы реплике в правильном порядке. Команды должны быть:
- Закодированы как массивы RESP.
- Отправлены по тому же соединению, что использовалось для рукопожатия (соединению репликации).
Примечания
- Хотя реплики указывают
listening-portпри рукопожатии, он нужен только для мониторинга и журналирования. Redis передаёт команды по TCP-соединению, открытому репликой при рукопожатии. - Полноценная реализация буферизовала бы команды до завершения загрузки RDB репликой. В этом задании можно считать, что реплика готова принимать команды сразу после получения файла RDB.
Проверка в вашей 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 zn8Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.