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

Собственный Redis

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

Этап 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 go

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

cd ./my-redis

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

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

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

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

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

go / ЛОКАЛЬНО

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

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

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

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