关于这个主题有几个问题,但没有一个问题可以解决这个问题。
我正在使用带有redis-store的Socket.IO,而我正在为流量增加做准备。我的托管公司说,“你需要使用Engine.IO而不是Socket.IO,因为它的效率更高”,所以我很想弄明白这意味着什么。
Questions like this似乎有相互矛盾的答案:
所以我看待它的方式:
但是后来Engine.IO说它是“负载平衡器友好”,但对redis没有任何说明。它必须有某种外店,对吧?但是如果它有多个传输和存储,那么Socket.IO有什么意义呢?
然后我看到Socket.IO might be abandoned和high profile companies are moving到Primus。
如何扩展Engine.IO?我是否必须自己编写商店?
答案 0 :(得分:10)
只是想分享我上周学到的东西,但希望其他人出现并明确回答这个问题,以便我给他们一张支票。
1)切勿使用Socket.IO(截至0.9.16)
我的主人告诉我使用Engine.IO(或其他任何东西)是对的。 Socket.IO有很多重大问题,其中最糟糕的是意外DDoS your server。我亲身体验过这个客户端相对较少,它完全禁用了我的服务器,直到我可以重写Socket.IO。我缩放到25+无人机以吸收这一击,这无所谓。单个客户端每秒可以发送1000个请求。
2)其他引擎没有Redis商店
Socket.IO允许您通过放入Redis商店来跨节点进行广播。据我所知,Engine.IO,Primus和SockJS不提供此功能。因此,当这些引擎声称“负载均衡器”友好时,并不意味着您可以跨节点进行广播。我开始认为这实际上是一件好事。使用redis编写pub / sub相对容易,并且将其分离出来非常好。
我最终使用Primus Engine.IO,然后使用redis pub / sub在节点之间共享事件。我花了大约5个小时来删除Socket.IO,连接Primus,写下pub / sub,然后上线。到目前为止,这是一次更好的体验。
<强>更新强>
结束Engine.IO也会进入重新连接循环(每秒几次),所以我最终使用了SockJS。它给了我最好的连接性和安全性。稳定性,Primus now handles the reconnect(SockJS不这样做)。
答案 1 :(得分:1)
我同意在发布v1.0之前应该避免使用Socket.IO,这是错误的,在我的测试中,Engine.IO的表现更好(https://medium.com/node-js-javascript/b63bfca0539)。 Primus绝对是一个不错的选择:也许你现在会使用Engine.IO但是当你发布Socket.IO 1.0时你会想要切换到它。
我用Engine.IO和Redis以及Pub / Sub结构实现了一个类似的程序,它看起来非常优雅。以下代码将连接的客户端订阅到房间/频道。
io.on('connection', function (socket) {
var observerRedisClient = redis.createClient();
observerRedisClient.subscribe(resourceId, redis.print);
observerRedisClient.on('message', function(channel, message) {
socket.send(message);
});
});
如果您更新该频道,即。保存一些数据并发布,然后所有订阅的客户端都会收到它。
redisClient.set(key, value, redis.print);
redisClient.publish(key, value);
如果您感兴趣,代码是开源的:https://github.com/denizozger/node-engine.io-server
答案 2 :(得分:-1)
好吧,正如你提到的那样,我应该看看Primus。使用HAProxy实现缩放。 作为底层通信,您仍然可以使用Socket.io,还可以使用engine.io。通过使用Primus,您可以尝试使用不同的库。 有一篇关于在http://pusher.com/docs/server_libraries缩放Redis的有趣文章。