簡體   English   中英

使用HAProxy擴展socket.io

[英]Scaling socket.io with HAProxy

到目前為止,我有一個node.js應用程序。 運行socket.io。 隨着用戶數量的增長,它在一天中的大部分時間達到100%CPU,因此我決定將用戶分成多個node.js進程。 我已經拆分了我的node.js應用程序邏輯,以允許對不同子域上的用戶進行分片。 我還將會話代碼提取到通過URL傳遞的令牌中,因此cookie並不重要。

我想使用我的8核機器的至少4個核心,所以我想運行多個node.js進程,每個進程在子域上為app提供服務。 為了能夠通過端口80訪問所有node.js,我決定使用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傳輸,它還需要很長時間才能建立連接。 一旦建立連接,它就能很好地運行。

我之前從未使用過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

我想到了。 我沒能在文檔中找到它,但全局maxconn設置不適用於前端。 前端默認有2000個並發連接,超出的所有內容都排隊等候。 由於我有長期的socket.io連接,這就產生了問題。

解決方案是在前端部分顯式設置maxconn。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM