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

28
задан ArrC 14 July 2014 в 10:40
поделиться

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

27
ответ дан 28 November 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: