Масштабирование socket.io с HAProxy
До сих пор у меня был один узел.JS app. бегом socket.io по мере роста числа пользователей он достигает 100% процессора большую часть дня, поэтому я решил разделить пользователей на несколько узлов.процессы js. Я расколол свой узел.логика приложения js позволяет сегментировать пользователей на разных поддоменах. Я также извлек код сеанса в токен, проходящий через URL, поэтому куки-файлы не важны.
Я хотел бы использовать по крайней мере 4 ядра моей 8-ядерной машины, поэтому я хочу запустить несколько узлов.Яш процессов, каждый из которых обслуживает приложение на поддомене. По порядку для всех узлов.чтобы 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
Теперь все работает, но reqular часть приложения (не используя socket.io) очень медленно. Она написана с использованием экспресс-метода.js и он работает быстро, когда я открываю страницу напрямую (то есть не через HAProxy). Кроме того, подключение к socket.io работает быстро с XHR транспортом, но для Websocket транспорта также требуется много времени, чтобы установить соединение. Однажды соединение установлено, оно работает хорошо и быстро.
Я никогда не использовал HAProxy раньше, так что я, вероятно, неправильно сконфигурировал что-то. Вот мой HAProxy config:
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 ответ:
Я понял это. Мне не удалось найти это в docs, но глобальная настройка maxconn не применяется к frontend. Frontend имеет по умолчанию 2000 параллельных соединений, и все, что выходит за его пределы, было поставлено в очередь. Так как я давно живу socket.io соединения это создавало проблемы.
Решение состоит в том, чтобы явно установить maxconn в разделе frontend.