но не разбирам как използването на RedisStore в този код би било различно от използването на MemoryStore. Може ли някой да ми обясни?
Разликата е, че когато използвате MemoryStore
по подразбиране , всяко съобщение, което излъчвате в работник, ще бъде изпратено само до клиенти, свързани със същия работник, тъй като няма IPC между работниците. Използване на 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 не се споделят между работниците. Това вероятно ще означава проблеми, ако използвате някой от транспортите с дълга анкета.