用HAProxy缩放socket.io

到目前为止,我有一个node.js应用程序。 运行socket.io。 随着用户数量的增长,一天的大部分时间都达到了100%的CPU,所以我决定把用户分成多个node.js进程。 我已经拆分了我的node.js应用程序逻辑,以允许不同子域上的用户分片。 我还将会话代码提取到通过URL传递的令牌中,所以Cookie不重要。

我想使用我的8核心机器的至less4个核心,所以我想要运行多个node.js进程,每个进程服务子域上的应用程序。 为了使所有的node.js能通过端口80访问,我决定使用HAProxy。 安装程序如下所示:

domain.com -> haproxy -> node on 127.0.0.1:5000 sub1.domain.com -> haproxy -> node on 127.0.0.1:5001 sub2.domain.com -> haproxy -> node on 127.0.0.1:5002 sub3.domain.com -> haproxy -> node on 127.0.0.1:5003 

现在一切正常,但应用程序的一部分(不使用socket.io)是非常缓慢的。 它使用Express.js编写,当我直接打开页面(即不通过HAProxy)时,它工作的很快。 此外,连接到socket.io与XHR运输快速工作,但对于WebSocket运输也需要很长时间来build立连接。 连接build立后,工作正常,快速。

我以前从来没有使用过HAProxy,所以我可能错误地configuration了一些东西。 这是我的HAProxyconfiguration:

 global maxconn 50000 daemon defaults mode http retries 1 contimeout 8000 clitimeout 120000 srvtimeout 120000 frontend http-in bind *:80 acl is_l1 hdr_end(host) -i sub1.domain.com acl is_l2 hdr_end(host) -i sub2.domain.com acl is_l3 hdr_end(host) -i sub3.domain.com acl is_l0 hdr_end(host) -i domain.com use_backend b1 if is_l1 use_backend b2 if is_l2 use_backend b3 if is_l3 use_backend b0 if is_l0 default_backend b0 backend b0 balance source option forwardfor except 127.0.0.1 # stunnel already adds the header server s1 127.0.0.1:5000 backend b1 balance source option forwardfor except 127.0.0.1 # stunnel already adds the header server s2 127.0.0.1:5001 backend b2 balance source option forwardfor except 127.0.0.1 # stunnel already adds the header server s2 127.0.0.1:5002 backend b3 balance source option forwardfor except 127.0.0.1 # stunnel already adds the header server s2 127.0.0.1:5003 

我想到了。 我没有find这个在文档中,但全球maxconn设置不适用于前端。 前端具有2000个并发连接的默认值,超出的部分已排队。 由于我有长期socket.io连接,这就产生了问题。

解决的办法是在前端部分显式设置maxconn。