Проектная лаборатория
Собственный Redis
Этап 90 · Публикация и подписка
Доставка сообщений
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы добавите доставку опубликованных сообщений подписанным клиентам.
Доставка сообщений
Когда клиент выполняет PUBLISH, сообщение доставляется всем клиентам, которые сейчас подписаны на канал.
Например, клиент, подписанный на channel_1, при отправке сообщения hello увидит примерно следующее:
$ redis-cli
> SUBSCRIBE channel_1
1) "subscribe"
2) "channel_1"
3) (integer) 1
# (client is now in subscribed mode)
# When a message is published, it receives the following array:
1) "message"
2) "channel_1"
3) "hello"Каждый подписчик получает массив из 3 элементов:
- "message" как объёмную строку RESP.
- Имя канала как объёмную строку RESP.
- Содержимое сообщения как объёмную строку RESP.
В этом случае каждый подписчик получает ["message", "channel_1", "hello"], закодированный так:
*3\r\n
$7\r\n
message\r\n
$9\r\n
channel_1\r\n
$5\r\n
hello\r\nТесты
Тестирующая программа запустит вашу программу так:
$ ./your_program.shЗатем создаст несколько клиентов, слушающих разные каналы.
# Client 1 subscribes to foo
$ redis-cli
> SUBSCRIBE foo
# Client 2 subscribes to foo
$ redis-cli
> SUBSCRIBE foo
# Client 3 subscribes to bar
$ redis-cli
> SUBSCRIBE barПосле этого создаст отдельного клиента и отправит PUBLISH для случайных каналов.
$ redis-cli
> PUBLISH foo "hello"
2
> PUBLISH bar "world"
1Тест проверит, что PUBLISH возвращает число подписчиков канала.
Для каждого клиента также будет проверено получение сообщения при наличии подписки. Каждый подписчик должен получить массив вида ["message", "foo", "hello"]. В RESP он выглядит так:
*3\r\n
$7\r\n
message\r\n
$3\r\n
foo\r\n
$5\r\n
hello\r\nЕсли клиент не подписан на канал, тест проверит, что он не получает отправленные туда сообщения.
Проверка в вашей 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 dn4Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.