Почему производительность 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 пользовательский знак, который является "повышением производительности". В том смысле, что теперь вы можете работать с большим количеством пользователей, но на самом деле это не увеличение скорости. Если это имеет смысл. Надеюсь это поможет!

Другие вопросы по тегам