Почему производительность redis+socket.io лучше, чем socket.io?
Раньше у меня был весь мой код на сервере socket.io+node.js. Недавно я преобразовал весь код в redis+socket.io+socket.io+node.js, заметив низкую производительность, когда слишком много пользователей отправляют сообщения через сервер. Итак, почему только socket.io был медленным, потому что он не многопоточный, поэтому он обрабатывает один запрос или отправку за раз. Redis распределяет эти запросы или отправляет их по каналам. Клиенты подписываются на разные каналы, и когда сообщение публикуется на канале, все клиенты, подписанные на него, получают сообщение. Это делается через этот кусок кода:
sub.on("message", function (channel, message) {
client.emit("message",message);
});
Client.on('emit',function(){}) берет его отсюда, чтобы публиковать сообщения на разных каналах.
Вот краткий код, объясняющий, что я делаю с Redis:
io.sockets.on('connection', function (client) {
var pub = redis.createClient();
var sub = redis.createClient();
sub.on("message", function (channel, message) {
client.emit('message',message);
});
client.on("message", function (msg) {
if(msg.type == "chat"){
pub.publish("channel." + msg.tousername,msg.message);
pub.publish("channel." + msg.user,msg.message);
}
else if(msg.type == "setUsername"){
sub.subscribe("channel." +msg.user);
}
});
});
Поскольку redis хранит информацию о канале, мы можем публиковать разные серверы на одном и том же канале.
Итак, что я не понимаю, так это то, что если sub.on("message") вызывается каждый раз при отправке запроса или emit, почему redis должен обеспечивать лучшую производительность? Я полагаю, что даже метод sub.on("message") не является многопоточным.
1 ответ
Как вы, возможно, знаете, Redis
позволяет масштабировать с несколькими node
экземпляров. Таким образом, производительность на самом деле идет после факта. Используя Pub/Sub
метод не быстрее. Это технически медленнее, потому что вы должны общаться между Redis
для каждого Pub/Sign
сигнал. "Повышение производительности" действительно верно только тогда, когда вы начинаете горизонтальное масштабирование.
Например, у вас есть один node
экземпляр (простой чат) - который может обрабатывать максимум 200
активные пользователи. Вы не используете Redis
пока что нет необходимости. Теперь, что если вы хотите иметь 400
активные пользователи? Используя ваш пример выше, теперь вы можете достичь этого 400
пользовательский знак, который является "повышением производительности". В том смысле, что теперь вы можете работать с большим количеством пользователей, но на самом деле это не увеличение скорости. Если это имеет смысл. Надеюсь это поможет!