Примеры использования RedisStore в socket.io

Я пытаюсь масштабировать простое приложение 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, поэтому, пожалуйста, укажите, пропустил ли я что-то очевидное.

Ответ 1

но я не понимаю, как использование 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 не разделяются между работниками. Это, вероятно, будет означать проблемы, если вы используете какой-либо длинный опрос.

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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