Опубликовать подписаться с помощью nodejs и redis (node_redis) - PullRequest
4 голосов
/ 28 февраля 2011

Я пытаюсь создать общий сервер публикации / подписки с помощью nodejs и node_redis, который получает запросы от браузера с именем канала и отвечает любыми данными, опубликованными для этого канала.Для этого я использую длинные запросы на опрос из браузера и обрабатываю эти запросы, отправляя ответ при получении сообщения по каналу.

Для каждого нового запроса создается объект для подписки наканал (если и только если он еще не существует).

clients = {};

//when request comes in,
clients[channel] = redis.createClient();
clients[channel].subscribe(channel);

Это лучший способ работы с каналами подписки, или есть какой-то другой, более интуитивный способ?

Ответы [ 4 ]

4 голосов
/ 02 марта 2011

Я не знаю, каков ваш дизайн, но вы можете подписаться на один Redis-клиент на нескольких каналах (после того, как вы подпишетесь на клиента, вы можете подписаться только на другой канал или отменить подписку в этом соединении: http://redis.io/commands/subscribe),потому что после того, как вы получили сообщение, у вас есть полная информация о том, из какого канала пришло это сообщение. Затем вы можете распространить это сообщение среди всех заинтересованных клиентов.

Это мне немного помогло, потому что я мог поместить тип сообщения в название каналаа затем динамически выбирать действие для каждого сообщения из небольшой функции вместо создания отдельной подписки для каждого канала с отдельной логикой.

Внутри моего сервера node.js у меня есть только 2 клиента redis:

  1. простой клиент для всех стандартных действий - lpush, sadd и т. Д.
  2. клиент подписки - который прослушивает сообщения по подписанным каналам, затем эти сообщения распределяются по всем сеансам (сохраняются как наборы для каждоготип канала) с использованием первого клиента Redis.
2 голосов
/ 01 марта 2011

Я хотел бы указать вам на мой пост о pubsub, используя socket.io вместе с redis. Socket.io - очень хорошая библиотека =>

Как использовать redis PUBLISH / SUBSCRIBE с nodejs для уведомления клиентов об изменении значений данных?

Я думаю, что дизайн очень прост, и он также должен быть очень масштабируемым.

1 голос
/ 01 марта 2011

Это кажется довольно разумным решением для меня. Что тебе не нравится в этом?

Следует иметь в виду, что вы можете иметь несколько подписок на каждое соединение Redis. Это может в конечном итоге усложнить вашу логику, которая противоположна тому, что вы просите. Однако в масштабе это может быть необходимо. Каждое подключение Redis относительно недорогое, но для него требуется файловый дескриптор и немного памяти.

0 голосов
/ 20 июля 2015

Завершено Пример Redis Pub / Sub ( Чат в реальном времени с использованием Hapi.js & Socket.io)

Мы пытались понять Redis Publish / Subscribe (" Pub / Sub "), и все существующие примеры были либо устаревшими, либо слишком простыми, либо не имели тестов. Итак, мы написали Завершено Чат в реальном времени с использованием Hapi.js + Socket.io + Redis Pub / Sub Пример с сквозными тестами !

https://github.com/dwyl/hapi-socketio-redis-chat-example

Build Status Test Coverage Code Climate Dependency Status devDependency Status

Компонент Pub / Sub - это всего лишь несколько строк кода node.js: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40

Вместо того, чтобы вставлять его здесь ( без контекста ), мы рекомендуем вам оформить заказ / попробовать пример .

Мы создали его, используя Hapi.js , но файл chat.js не связан от Hapi и может легко использоваться с базовый node.js http сервер или экспресс (и т. д.)

...