Примеры использования RedisStore в socket.io - PullRequest
28 голосов
/ 14 февраля 2012

Я пытаюсь масштабировать простое приложение socket.io для нескольких процессов и / или серверов.

Socket.io поддерживает RedisStore, но я не совсем понимаю, как его использовать.

Я смотрю на этот пример, http://www.ranu.com.ar/post/50418940422/redisstore-and-rooms-with-socket-io

но я не понимаю, как использование RedisStore в этом коде будет отличаться от использования MemoryStore. Может кто-нибудь объяснить это мне?

Кроме того, в чем разница между настройкой socket.io для использования redisstore и созданием собственного клиента redis и настройкой / получением собственных данных?

Я новичок в node.js, socket.io и redis, поэтому, пожалуйста, укажите, пропустил ли я что-то очевидное.

Ответы [ 4 ]

27 голосов
/ 14 февраля 2012

но я не понимаю, как использование RedisStore в этом коде будет отличаться от использования MemoryStore.Кто-нибудь может мне это объяснить?

Разница в том, что при использовании значения по умолчанию MemoryStore любое сообщение, которое вы отправляете в работнике, будет отправляться только клиентам, подключенным к тому же работнику, посколькунет МПК между рабочими.Используя RedisStore, ваше сообщение будет опубликовано на сервере Redis, на который подписаны все ваши сотрудники.Таким образом, сообщение будет получено и передано всеми работниками и всеми подключенными клиентами.

Кроме того, в чем разница между настройкой socket.io для использования redisstore и созданием собственного клиента redis и установкой /получить свои собственные данные?

Я не очень знаком с RedisStore, и поэтому я не уверен во всех различиях.Но делать это самостоятельно было бы вполне приемлемой практикой.В этом случае вы можете опубликовать все сообщения на сервере redis и прослушать их в обработчике сокетов.Возможно, это будет больше работы для вас, но вы также будете иметь больше контроля над тем, как вы хотите его настроить.Я сам сделал нечто подобное:

// Publishing a message somewhere
var pub = redis.createClient();
pub.publish("messages", JSON.stringify({type: "foo", content: "bar"}));

// Socket handler
io.sockets.on("connection", function(socket) {
  var sub = redis.createClient();
  sub.subscribe("messages");
  sub.on("message", function(channel, message) {
    socket.send(message);
  });

  socket.on("disconnect", function() {
    sub.unsubscribe("messages");
    sub.quit();
  });
});

Это также означает, что вы должны позаботиться о более продвинутой маршрутизации сообщений, например, публикуя / подписываясь на разные каналы.С RedisStore вы получаете эту функциональность бесплатно, используя каналы socket.io (io.sockets.of("channel").emit(...)).

Потенциально большой недостаток в этом заключается в том, что сессии socket.io не распределяются между работниками.Это, вероятно, будет означать проблемы, если вы используете какой-либо транспорт с длинным опросом.

3 голосов
/ 23 июля 2012

Я настроил небольшой проект github для использования redis в качестве хранилища данных.

Теперь вы можете запускать несколько процессов сервера socket.io.

https://github.com/markap/socket.io-scale

2 голосов
/ 15 августа 2012

Кроме того, в чем разница между настройкой socket.io для использования redisstore и созданием собственного клиента redis и настройкой / получением собственных данных?

Разница в том, что когда вы используете RedisStore, socket.io сам сохранит пульс сокета и информацию о сеансе в Redis, а если вы используете кластер с node.js, пользовательский клиент может работать.

Без redis клиент может изменить процесс node.js в следующий раз, поэтому сеанс будет потерян.

0 голосов
/ 22 июня 2012

Разница в том, что если у вас запущен кластер экземпляров node.js, memStore не будет работать, поскольку он виден только одному процессу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...