Масштабирование 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 4

1 ответ:

Я понял это. Мне не удалось найти это в docs, но глобальная настройка maxconn не применяется к frontend. Frontend имеет по умолчанию 2000 параллельных соединений, и все, что выходит за его пределы, было поставлено в очередь. Так как я давно живу socket.io соединения это создавало проблемы.

Решение состоит в том, чтобы явно установить maxconn в разделе frontend.