【问题标题】:Scaling socket.io with HAProxy使用 HAProxy 扩展 socket.io
【发布时间】:2012-09-15 20:53:15
【问题描述】:

到目前为止,我只有一个 node.js 应用程序。运行 socket.io。随着用户数量的增长,它在一天中的大部分时间都达到了 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

【问题讨论】:

    标签: node.js socket.io haproxy


    【解决方案1】:

    我想通了。我在文档中找不到这个,但全局 maxconn 设置不适用于前端。前端默认有 2000 个并发连接,超出的所有内容都已排队。由于我有长期的 socket.io 连接,这会产生问题。

    解决方案是在前端部分显式设置 maxconn。

    【讨论】:

    • 你是对的。或者,您可以在默认部分设置此 maxconn,它将应用于所有前端。请记住,您始终希望前端的 maxconn 略低于全局部分,以避免一个前端使整个过程饱和的风险。
    猜你喜欢
    • 2014-12-07
    • 2012-08-16
    • 2016-03-16
    • 2018-09-01
    • 1970-01-01
    • 2014-11-25
    • 2020-09-10
    • 1970-01-01
    • 2015-02-09
    相关资源
    最近更新 更多