使用HAProxy扩展socket.io

4

目前我有一个运行socket.io的单个node.js应用程序。随着用户数量增加,它大部分时间都达到100%的CPU使用率,因此我决定将用户拆分为多个node.js进程。我已经将node.js应用程序逻辑拆分,以允许在不同子域上进行用户分片。我还通过URL提取了会话代码,以便通过令牌传递,因此cookie并不重要。

我想利用我的8核机器上至少4个内核来运行多个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)时工作得很快。此外,使用XHR传输连接到socket.io也很快,但对于Websocket传输,建立连接也需要很长时间。一旦连接建立,它就可以快速地运行。
我以前从未使用过HAProxy,所以我可能配置错误了一些东西。这是我的HAProxy配置:
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
1个回答

3
我想通了。我在文档中没有找到这个信息,但是全局的最大连接数设置不适用于前端。前端有默认的2000并发连接,超过这个数量就会排队等待。由于我有长时间运行的socket.io连接,这造成了问题。
解决方案是在前端部分明确设置maxconn。

1
你是对的。或者,您可以在默认部分中设置此maxconn,它将适用于所有前端。请记住,在前端中,您始终希望将maxconn略低于全局部分,以避免一个前端饱和整个进程的风险。 - Willy Tarreau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接