[英]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.