Socket.io和负载均衡器

时间:2012-06-09 21:16:12

标签: node.js websocket socket.io load-balancing

我正在使用Socket.io和Node.js,并且在Stingray负载均衡器后面有两个实例。

使用Generic Streaming设置负载均衡器,并且在大多数情况下,似乎工作正常。但是,我注意到一些零星的行为。

基本上,有两个实例可以连接到一个实例,如果一个实例发送到所有套接字,另一个实例将不会看到或获取这些实例。

这听起来准确吗?有谁知道如何确保任一服务器完成的发送都发送到连接到任何服务器的客户端?

谢谢! 戴夫

1 个答案:

答案 0 :(得分:1)

我在开发Mote.io时遇到了类似的问题,并决定采用托管解决方案而不是构建负载均衡器。处理此问题非常困难,因为您需要跨服务器同步数据或将客户端负载平衡到同一实例,以确保它们获得所有相同的消息。

Socket.io对此没什么帮助。您需要实现redis,其他一些数据同步或负载平衡应用程序。

PubNub也会照顾到这一点。后端负责在抽象级别同步消息,负载平衡等,所以你所做的就是提供一个频道名称,PubNub将确保该频道中的所有客户端都能收到消息。

10行代码中的实时聊天应用

enter image description here

Enter Chat and press enter
<div><input id=input placeholder=you-chat-here /></div>

Chat Output
<div id=box></div>

<script src=http://cdn.pubnub.com/pubnub.min.js></script>
<script>(function(){
var box = PUBNUB.$('box'), input = PUBNUB.$('input'), channel = 'chat';
PUBNUB.subscribe({
    channel  : channel,
    callback : function(text) { box.innerHTML = (''+text).replace( /[<>]/g, '' ) + '<br>' + box.innerHTML }
});
PUBNUB.bind( 'keyup', input, function(e) {
    (e.keyCode || e.charCode) === 13 && PUBNUB.publish({
        channel : channel, message : input.value, x : (input.value='')
    })
} )
})()</script>