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

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

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

Этап 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 элементов:

  1. "message" как объёмную строку RESP.
  2. Имя канала как объёмную строку RESP.
  3. Содержимое сообщения как объёмную строку 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 go

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

cd ./my-redis

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

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

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

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

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

go / ЛОКАЛЬНО

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

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

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

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