Redis Pub-Sub или Socket.IO
Я видел этот фрагмент:
На сервере
io.sockets.on('connection', function(socket) {
const subscribe = redis.createClient();
const publish = redis.createClient();
socket.on('publish', function(channel, data) {
publish.publish(channel, data);
});
socket.on('psubscribe', function(channel) {
subscribe.psubscribe(channel);
});
subscribe.on("pmessage", function(pattern, channel, message) {
socket.emit('message', { channel: channel, data: message });
});
});
На клиенте
$(".action").click(function() {
socket.emit('publish', 'game.#{gameid}.action.' + $(this).data('action'),
JSON.stringify({ nick: "#{nick}", ts: Date.now() })
);
И мне интересно, почему? Не имеет ли Socket.IO собственный механизм вещания? Зачем выбирать Redis 'Pub-Sub над Socket.IO? Разве мы не можем просто так:
io.sockets.on('connection', function(socket) {
socket.on('action', function(channel, data) {
socket.broadcast.to(channel).emit(data)
});
});
И если есть причина использовать Redis, какая польза? Постоянство?
Ответы
Ответ 1
Причина, по которой я решил использовать Redis Pub Sub с Socket.io в моем проекте Activity Activity в реальном времени (http://blog.cloudfoundry.com/2012/06/05/node-activity-streams-app-2/), объясняется тем, что я хотел иметь несколько веб-серверов (экземпляры в Cloud Foundry или dynos на Heroku). Насколько я мог видеть, Socket.io хранит сообщения в памяти (одного веб-сервера), и как он может транслироваться для клиентов, подключенных к другому веб-серверу?
Обратите внимание на post и сообщите мне, помогает ли она
Ответ 2
Redis используется здесь по крайней мере по двум причинам. Первый заключается в том, что он работает очень хорошо, как механизм публикации и подписки, в том числе возможность выбора сообщений на основе соответствия шаблонов для psubscribe. Вторая причина заключается в легкости других клиентов, которые могут публиковать и подписываться через механизм redis. Это не значит, что это невозможно, просто удобно. Это в сочетании с асинхронизностью node.js создает мощное партнерство.
Это не единственное решение, конечно, но похожее, которое работает довольно хорошо.