我之前在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”),为什么redis应该提供更好的性能?我想甚至sub.on(“message”)方法也不是多线程的。
答案 0 :(得分:0)
您可能知道,Redis
允许您使用多个node
实例进行扩展。所以性能实际上是在事后发生的。使用Pub/Sub
方法并不快。它在技术上较慢,因为您必须在每个Redis
信号的Pub/Sign
之间进行通信。当你开始横向扩展时,“提供更好的性能”才是真的。
例如,您有一个 node
实例(简单聊天室) - 可以处理最多200
个活跃用户。您还没有使用Redis
,因为没有必要。现在,如果您想拥有400
活跃用户,该怎么办?在使用上面的示例时,您现在可以实现此400
用户标记,这是“性能提升”。从某种意义上说,您现在可以处理更多用户,但实际上不会增加速度。如果这是有道理的。希望这有帮助!