Проектная лаборатория
Собственный Redis
Этап 38 · Репликация
Подтверждения ACK после команд
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы расширите REPLCONF GETACK, чтобы ответ содержал количество байтов команд, обработанных репликой.
Напоминание о подтверждениях ACK
Ведущий использует ACK, чтобы проверять синхронизацию реплик и отсутствие отставания. Каждый ACK содержит смещение — количество байтов команд, обработанных репликой.
Отслеживание смещения
Реплика обновляет смещение, учитывая полный размер в байтах каждой команды от ведущего. Учитываются как команды записи, например SET, DEL, так и остальные команды, например PING, REPLCONF GETACK *.
После обработки команды, например ["SET", "foo", "bar], реплика прибавляет полную длину её массива RESP в байтах к текущему смещению.
Важное правило: возвращаемое смещение включает только команды, обработанные до текущего запроса REPLCONF GETACK *.
Например:
- Реплика подключается, завершает рукопожатие, и ведущий отправляет
REPLCONF GETACK *.- Реплика отвечает
REPLCONF ACK 0: до этого запроса команды ещё не обрабатывались.
- Реплика отвечает
- Затем ведущий отправляет ещё один
REPLCONF GETACK *.- Реплика отвечает
REPLCONF ACK 37, поскольку предыдущая командаREPLCONFзаняла 37 байт.
- Реплика отвечает
- Ведущий отправляет
PING.- Реплика молча обрабатывает команду, увеличивает смещение на 14 и не отправляет ответ.
- Приходит следующий
REPLCONF GETACK *.- Реплика отвечает
REPLCONF ACK 88: 37 за первыйREPLCONF, +37 за второйREPLCONF, +14 заPING.
- Реплика отвечает
Сам текущий запрос GETACK в возвращаемое смещение не включается.
Тесты
Тестирующая программа запустит вашу программу так:
./your_program.sh --port <PORT> --replicaof "<HOST> <PORT>"Как и раньше, реплика должна завершить рукопожатие с ведущим и получить пустой RDB.
Затем ведущий передаст реплике серию команд, чередуя их с REPLCONF GETACK *.
REPLCONF GETACK * # expect: REPLCONF ACK 0
PING # replica processes silently
REPLCONF GETACK * # expect: REPLCONF ACK 51
# 51 = 37 (first REPLCONF) + 14 (PING)
SET foo 1 # replica processes silently
SET bar 2 # replica processes silently
REPLCONF GETACK * # expect: REPLCONF ACK 146
# 146 = 51 + 37 (second REPLCONF) + 29 (SET foo) + 29 (SET bar)Реплика должна вычислять и возвращать точное смещение на каждом шаге в ответе REPLCONF ACK <offset>. Ответ также должен быть массивом RESP.
Примечания
- Смещение должно включать только байты команд, обработанных до получения текущей команды
REPLCONF GETACK. - Хотя ведущие не пересылают клиентские
PINGрепликам, поскольку это не команды записи, они могут сами отправлятьPING, чтобы сообщить репликам, что ведущий ещё работает.
Проверка в вашей 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 yd3Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.