Я был бы признателен, если бы кто-нибудь помог мне с небольшим сомнением.
В чем разница между использованием широковещательной функции socket.io и проектированием архитектуры с помощью pub/sub на Redis?
Например, в следующем примере сервер node.js прослушивает (socket.io) CRUD-запросы (создает) для «ключа» (модель «todo») и значения «данные». В тот момент, когда он его получает, он снова излучает тому же пользователю и транслирует всем пользователям, слушающим тот же «канал».
socket.on('todo:create', function (data, callback) {
var id = guid.gen()
, todo = db.set('/todo/' + id, data)
, json = todo._attributes;
socket.emit('todos:create', json);
socket.broadcast.emit('todos:create', json);
callback(null, json);
});
Но есть еще один способ «транслировать» что-то с помощью socket.io, а именно использовать платформу pub/sub с Redis для функций ключ:значение. Например, в следующем случае мы прослушиваем запрос CRUD на основе «ключа» (модели), функции (создания) и значения (данных). Но в этом случае, как только он получен, он не отправляется через «socket.broadcast.emit()», а публикуется в Redis:
socket.on(key + ':create', function (data, callback) {
var t = new ModelClass(data)
, name = '/' + key + ':create';
t.save(function (err) {
pub.publish(key, JSON.stringify({key: name, data: t}));
});
});
Таким образом, на стороне сервера каждое изменение, сделанное в модели (и опубликованное в Redis), будет перехвачен (обработчик) и отправлен на клиентскую сторону пользователя (в моем случае backbone.js), который будет отображать свою модель в соответствии с полученным ключом: значение:
sio.on('connection', function (socket) {
sub.on('message', function (channel, message) {
var msg = JSON.parse(message);
if (msg && msg.key) {
socket.emit(msg.key, msg.data);
}
});
Итак, мой вопрос очень прост :-): в чем разница между обеими архитектурами? какой из них более масштабируемый? лучший дизайн? режим продвижения?
Мне кажется, что архитектура pub/sub подходит для платформ, которые не поддерживают «реальное время» естественным образом, например, Ruby, в отличие от Node.js, который поддерживает его изначально. . Я ошибаюсь?