@nodejs_ru

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

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

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

Google
Vladislav
29.06.2017
14:15:12
cluster ?
Ответил выше)

KlonD90
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 крутится на одном ядре - немного напрягает. Ибо проекту есть еще куда расти. И не охота чтобы так и было.

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 вместо редис?

https://socket.io/docs/using-multiple-nodes/
Оно будет на разных ядрах типо работать?

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
Тупо поднимаешь несколько процессов NodeJS, они автоматом начинают использовать разные ядра.
Выходит по сути мне надо запустить проект на разных портах? И добавить синхронизацию socket.io

Но из-за того, что у socket.io есть функционал типа "отправить сообщение всем клиентам", ему нужна MQ для взаимодействия между нодами.
Отправить всем - такого точно нету. Но отправить сокету, который вероятно на другой ноде - это да

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
хотя начина.ю смотреть в сторону traefik
самый слабый из альтернатив, смотри лучше на gobetween или caddy

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

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

Vint
29.06.2017
14:57:20
как там балансировка если ws это tcp-соединение?
Как? Или, может, какая? Не понял вопроса.

Aleksandr
29.06.2017
14:57:55
Как? Или, может, какая? Не понял вопроса.
какая? она там не нужна просто, вся синхронизация это логика приложения

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
sticky это разные tcp-соединения
Вот и надо все соединения одного юзера прокидывать в один и тот же инстанс ноды.

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
какая тебе разница куда пришел клиент снова после закрытия сессии?
Мне важно, куда пришёл юзер, если у него несколько соежинений по сокету.

хаха, да это ты просто уничтожаешь смысл балансировки логикой своей
Тут нет логики. sticky - это и есть гвозди. per-user гвозди.

Admin
ERROR: S client not available

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

Тут нет логики. sticky - это и есть гвозди. per-user гвозди.
sticky неактуален для http/2 и ws, только udp и http/1

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

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

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

Aleksandr
29.06.2017
15:07:07
А что здесь есть сервис? У нас есть сокет-бек и сокет-фронт, грубо.
зачем несколько соединений от одного клиента? когда хватит одного за глаза

Vint
29.06.2017
15:07:47
зачем несколько соединений от одного клиента? когда хватит одного за глаза
Давай в реальных примерах. Чатик на сокетах. Две вкладки (таба) с браузере. Сессия та же, сокет-соединения разные.

Vint
29.06.2017
15:09:00
такое часто бывает?
Почему бы нет?

SPA и вся хуйня, но табы никто не запрещал.

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

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

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

Ты не вник в суть. У человека socket.io
и что? ты про браузеры которые ws не поддерживают?

Vint
29.06.2017
15:11:22
ну ок, разные табы не запретить, кроме этого какие еще варианты нескольких коннектов от одного клиента?
Мм. Несколько разных сокет-соединений, когда не хватает неймспейсов и "румов" в сокетах? Пока не знаю зачем, но думаю, что есть и такое применение.

Сука, русский язык не мой сегодня) В коде другая раскладка.

KlonD90
29.06.2017
15:12:08
и что? ты про браузеры которые ws не поддерживают?
Там сначала хэндшейк идет а потом идет мисматч сессии сокет.ио

Vint
29.06.2017
15:21:07
http -> socket.io/N/?t= (sticky) ws -> socket.io/N/websocket
Но ведь и http и ws одинаково скалируются по нодам. Или ты предлагаешь для ws только один инстанс держать?

Aleksandr
29.06.2017
15:23:26
Но ведь и http и ws одинаково скалируются по нодам. Или ты предлагаешь для ws только один инстанс держать?
я к тому что ws - это другой локейшен и там поведение другое по идее, там логика и конфигурация в общем случае другая, и там нечего прибивать, там сессия атомарная на уровне tcp, соединение там одно, а прибивать надо согласование коннекта и это http, один на получение "оффера" второй со свитчем протокола

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
Там протокол такой что сначала клиент высылает список доступного транспорта по хттп и получает сессию. Затем если он умеет в ws делает запрос. Второй запрос должен прийти туда же куда и первый
скажем так ниже первого, ip-hash (sticky это левый модуль и нужен был когда хэш был платным) тут нужен только чтобы второй запрос http пришел туда же с кем был согласован (хотя это не принципиально при идентичности нод), а вот для ws ip-hash смысла не имеет

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

Страница 936 из 2748