
Vladislav
29.06.2017
14:13:54
Ребят, такой вот вопрос. Проект вырос немного. Появились первые проблемы связанные с нехваткой опыта. Сейчас есть главная проблема. Проект на nodejs начинает отжирать одно ядро в 100% до тех пор пока forever его не перезапустит. Все бы ничего. Но юзеров выкидывает из socket соедениения, что не есть хорошо. Вопрос в том, как грамотно заставить nodejs распредеить нагрузку на разные ядра?

Александр
29.06.2017
14:14:29
cluster ?

KlonD90
29.06.2017
14:14:51

Vladislav
29.06.2017
14:15:02
Я видел. Много читал за него. Но решил перед этим спросить еще и людей. Чтобы не напоротся.

Google

Vladislav
29.06.2017
14:15:12

KlonD90
29.06.2017
14:15:33
Вообще правильный подход начать дробить на то что есть фронт ноды принимающие задачи, а сзади там расширяется очередь задач над которыми трудятся воркеры

arts
29.06.2017
14:15:33

Vladislav
29.06.2017
14:15:39
Под нагрузкой.

arts
29.06.2017
14:16:07
Тогда кластер, да.

KlonD90
29.06.2017
14:16:07
Ну или любое другое разбиение

Vladislav
29.06.2017
14:17:04
Само по себе не жрет. Держится в пределах пары процентов. А когда людей становится больше - получается шляпа. Сейчас уже вынесли самую нагруженную чать проекта, которая топила на сеть. Проблемы вроде как нету. Но то что nodejs крутится на одном ядре - немного напрягает. Ибо проекту есть еще куда расти. И не охота чтобы так и было.

KlonD90
29.06.2017
14:17:56

Gleb
29.06.2017
14:18:02

Vladislav
29.06.2017
14:18:05

Александр
29.06.2017
14:18:35
добавь cluster у себя на компе и проведи нагрузочное, потом в прод.

Gleb
29.06.2017
14:18:44
Да.
В cluster его не пихай, ему нельзя. Только на отдельные порты и сзади синхронизацию через redis.
Ему требуется sticky session, а cluster такого не умеет.

Google

Vladislav
29.06.2017
14:19:36
У тебя там Socket.io?
У меня там шляпа была, ибо надо было реализовать видеостримнг на ios устройства с браузера с задержкой в пару сек(2-3). Из-за этого ложилась сеть немного. Это вынесли как отдельный сервер и переписал. Ибо писал изначально по топорному.

Gleb
29.06.2017
14:19:38
Если обычный http, то cluster заводи через pm2.

Vladislav
29.06.2017
14:20:05
Там почти вся логика юзает socket.io
http там пара точек вхождения. Но они не вызывают проблем.

Gleb
29.06.2017
14:21:26
Просто каждый запрос socket.io в рамках одной сессии должен идти на один и тот же процесс. В cluster такого не сделаешь, так что только на отдельные порты.
https://socket.io/docs/using-multiple-nodes/

Vladislav
29.06.2017
14:22:36
Ок. Это я понял. Т.е. мне надо сделать socket.io. на разных портах. Можно такое сделать с mongo вместо редис?

Gleb
29.06.2017
14:23:19
А, нет, есть какая-то фигня для sticky session, раньше не видел.
Тупо поднимаешь несколько процессов NodeJS, они автоматом начинают использовать разные ядра.

Vladislav
29.06.2017
14:24:45
И еще вопрос. У меня сейчас отдельно крутится видео-стриминговый сервер. Его можно в cluster? Там видео по webSokcet заливается на сервер. Но сокеты между собою никак не взаимодействуют.

Gleb
29.06.2017
14:25:06
Но из-за того, что у socket.io есть функционал типа "отправить сообщение всем клиентам", ему нужна MQ для взаимодействия между нодами.

Vladislav
29.06.2017
14:25:18

Gleb
29.06.2017
14:25:59
https://socket.io/docs/using-multiple-nodes/#passing-events-between-nodes

Vladislav
29.06.2017
14:29:03
Ну в общем суть я правильно уловил?Выходит по сути мне надо запустить проект на разных портах? И добавить синхронизацию socket.io

Gleb
29.06.2017
14:29:37
Угу.

KlonD90
29.06.2017
14:29:55
а впереди sticky balancer поставить

Gleb
29.06.2017
14:30:16
Да, это тоже важный момент.
Если nginx, то там sticky немного кривой в community версии, насколько я помню. Можно юзать IP hash.

Google

Evgeny
29.06.2017
14:33:23
А что там не так?

Vint
29.06.2017
14:35:39
Он немного туповат. В n+ больше возможностей для балансировки. Посмотри на сайте плюсовой версии.
Но для начала - вполне решение.

Evgeny
29.06.2017
14:36:32
Мне б скорее живые отзывы

Vint
29.06.2017
14:37:51
Я обычную пока пользую и пока всё окей. Скоро на толпе гоблинов будет проверяться, вот и посмотрю.
Обычная раскидывает почти 50 на 50 по IP, если два инстанса бека. Что уже неплохо.

KlonD90
29.06.2017
14:50:46
haproxy наше все
хотя начина.ю смотреть в сторону traefik

Dmitrii
29.06.2017
14:52:25
я caddy юзать стал

Aleksandr
29.06.2017
14:54:33

KlonD90
29.06.2017
14:56:12
чем лучше?

Aleksandr
29.06.2017
14:56:20

Aleksandr
29.06.2017
14:57:16
чем лучше?
стандартные батарейки, возможности расширения, документация

Vint
29.06.2017
14:57:20

Aleksandr
29.06.2017
14:57:55

Vint
29.06.2017
14:58:06

Aleksandr
29.06.2017
14:58:18
sticky это разные tcp-соединения
для того и нужен ip-hash

Vladislav
29.06.2017
14:58:48
Всем больше спасибо. Будем смотреть в сторону масштабирования socket.io

Vint
29.06.2017
14:58:54

Google

Aleksandr
29.06.2017
14:59:16
какая тебе разница куда пришел клиент снова после закрытия сессии?

Vint
29.06.2017
14:59:55

Aleksandr
29.06.2017
15:00:28

Vint
29.06.2017
15:00:34

Admin
ERROR: S client not available

Aleksandr
29.06.2017
15:01:11
балансировка для ws - это разброс постоянных соединений по выбранному критерию, там ip-hash неактуален вообще, потому что это постоянное содинение

Vint
29.06.2017
15:02:30
Мы о разном, похоже. Куда попадёт новое (для стейта приложения) соединение от нового юзера - не важно (как раз балансировка). Куда придёт соединение от уже активного юзера - важно.

Aleksandr
29.06.2017
15:03:14

Vint
29.06.2017
15:04:04
Но от него может быть N соединений (в рамках его сессии). Да, это тоже можно раскидать по разным нодам, но мне проще все соединения одного держать в одной ноде.

Aleksandr
29.06.2017
15:05:20

Vint
29.06.2017
15:06:11
А что здесь есть сервис? У нас есть сокет-бек и сокет-фронт, грубо.

Vladimir
29.06.2017
15:06:42

Aleksandr
29.06.2017
15:07:07

Vint
29.06.2017
15:07:47

Aleksandr
29.06.2017
15:08:42

Vint
29.06.2017
15:09:00
SPA и вся хуйня, но табы никто не запрещал.

Google

Sergey
29.06.2017
15:09:31
Aleksandr а ты на реакте делаешь фронт?

Vint
29.06.2017
15:10:00
И ты либо во всех табах даёшь жизнь, либо говоришь юзеру, мол, только одна вкладочка, сорян, экономим серверные ресурсы.

KlonD90
29.06.2017
15:10:33

Aleksandr
29.06.2017
15:10:34
Почему бы нет?
ну ок, разные табы не запретить, кроме этого какие еще варианты нескольких коннектов от одного клиента?

Vint
29.06.2017
15:11:22
Сука, русский язык не мой сегодня) В коде другая раскладка.

KlonD90
29.06.2017
15:12:08

Aleksandr
29.06.2017
15:13:08

Vint
29.06.2017
15:21:07

Aleksandr
29.06.2017
15:23:26

KlonD90
29.06.2017
15:23:33
так это sticky на другой локейшен, он http же
Там протокол такой что сначала клиент высылает список доступного транспорта по хттп и получает сессию. Затем если он умеет в ws делает запрос. Второй запрос должен прийти туда же куда и первый

Vint
29.06.2017
15:24:08
Вот, @klond90 уже ответил за меня.

Aleksandr
29.06.2017
15:26:39

KlonD90
29.06.2017
15:27:12

Aleksandr
29.06.2017
15:30:09
Контекст
а какой?
если ноды одинаковые у тебя? в согласовании есть контекст важный?