Проектная лаборатория
Собственный Redis
Этап 41 · Репликация
WAIT после нескольких команд
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы расширите WAIT для случая, когда реплики подключены и уже получили команды записи.
WAIT после передачи команд
Ранее мы обработали случаи, когда:
- Реплик нет, и ведущий может вернуть
0. - Реплики подключены, но ещё не получали команды записи.
Теперь рассмотрим случай, когда команды записи уже переданы репликам. Смещения репликации больше не равны 0, поэтому перед ответом ведущий должен проверить, какие реплики успешно обработали последнюю команду записи.
Для этого ведущий должен отправить репликам REPLCONF GETACK *, если после последнего WAIT остались неподтверждённые команды записи. Каждая реплика ответит своим текущим смещением (REPLCONF ACK <offset>).
Команда WAIT должна завершиться при любом из условий:
- Нужное число реплик подтвердило все предыдущие команды записи.
- Истекло время ожидания.
В обоих случаях ведущий возвращает число реплик, подтвердивших все предыдущие команды записи, в виде целого числа RESP.
Тесты
Тестирующая программа запустит вашу программу как ведущий сервер так:
./your_program.shЗатем запустит несколько реплик, которые подключатся к серверу. Каждая выполнит рукопожатие и будет ожидать пустой RDB.
Далее тест подключится к ведущему как клиент и отправит несколько команд записи вперемешку с WAIT:
$ redis-cli SET foo 123
$ redis-cli WAIT 1 500 # (must wait until either 1 replica has processed previous commands or 500ms have passed)
$ redis-cli SET bar 456
$ redis-cli WAIT 2 500 # (must wait until either 2 replicas have processed previous commands or 500ms have passed)Примечания
- Возвращённое количество реплик может быть меньше или больше числа, указанного в команде
WAIT.
Проверка в вашей 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 na2Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.