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