Aleksand
хотя начина.ю смотреть в сторону traefik
самый слабый из альтернатив, смотри лучше на gobetween или caddy
KlonD90
чем лучше?
Aleksand
чем лучше?
стандартные батарейки, возможности расширения, документация
Vint
как там балансировка если ws это tcp-соединение?
Как? Или, может, какая? Не понял вопроса.
Aleksand
Как? Или, может, какая? Не понял вопроса.
какая? она там не нужна просто, вся синхронизация это логика приложения
Aleksand
sticky это разные tcp-соединения
Aleksand
для того и нужен ip-hash
Vl
Всем больше спасибо. Будем смотреть в сторону масштабирования socket.io
Vint
sticky это разные tcp-соединения
Вот и надо все соединения одного юзера прокидывать в один и тот же инстанс ноды.
Aleksand
Вот и надо все соединения одного юзера прокидывать в один и тот же инстанс ноды.
а что ты будешь делать если у тебя прилипнут неравномерно?
Aleksand
какая тебе разница куда пришел клиент снова после закрытия сессии?
Vint
а что ты будешь делать если у тебя прилипнут неравномерно?
Неравномерно относительно кол-ва инстансов? Об этом я и писал, что в обычной версии туповатый (простой) механизм.
Vint
какая тебе разница куда пришел клиент снова после закрытия сессии?
Мне важно, куда пришёл юзер, если у него несколько соежинений по сокету.
Vint
хаха, да это ты просто уничтожаешь смысл балансировки логикой своей
Тут нет логики. sticky - это и есть гвозди. per-user гвозди.
Aleksand
балансировка для ws - это разброс постоянных соединений по выбранному критерию, там ip-hash неактуален вообще, потому что это постоянное содинение
Aleksand
Тут нет логики. sticky - это и есть гвозди. per-user гвозди.
sticky неактуален для http/2 и ws, только udp и http/1
Vint
Мы о разном, похоже. Куда попадёт новое (для стейта приложения) соединение от нового юзера - не важно (как раз балансировка). Куда придёт соединение от уже активного юзера - важно.
Vint
Но от него может быть N соединений (в рамках его сессии). Да, это тоже можно раскидать по разным нодам, но мне проще все соединения одного держать в одной ноде.
Vint
А что здесь есть сервис? У нас есть сокет-бек и сокет-фронт, грубо.
Aleksand
А что здесь есть сервис? У нас есть сокет-бек и сокет-фронт, грубо.
зачем несколько соединений от одного клиента? когда хватит одного за глаза
Vint
зачем несколько соединений от одного клиента? когда хватит одного за глаза
Давай в реальных примерах. Чатик на сокетах. Две вкладки (таба) с браузере. Сессия та же, сокет-соединения разные.
Vint
такое часто бывает?
Почему бы нет?
Vint
SPA и вся хуйня, но табы никто не запрещал.
GG
Aleksandr а ты на реакте делаешь фронт?
Vint
И ты либо во всех табах даёшь жизнь, либо говоришь юзеру, мол, только одна вкладочка, сорян, экономим серверные ресурсы.
Aleksand
Почему бы нет?
ну ок, разные табы не запретить, кроме этого какие еще варианты нескольких коннектов от одного клиента?
Aleksand
Ты не вник в суть. У человека socket.io
и что? ты про браузеры которые ws не поддерживают?
Vint
ну ок, разные табы не запретить, кроме этого какие еще варианты нескольких коннектов от одного клиента?
Мм. Несколько разных сокет-соединений, когда не хватает неймспейсов и "румов" в сокетах? Пока не знаю зачем, но думаю, что есть и такое применение.
Vint
Сука, русский язык не мой сегодня) В коде другая раскладка.
KlonD90
и что? ты про браузеры которые ws не поддерживают?
Там сначала хэндшейк идет а потом идет мисматч сессии сокет.ио
Aleksand
Vint
http -> socket.io/N/?t= (sticky) ws -> socket.io/N/websocket
Но ведь и http и ws одинаково скалируются по нодам. Или ты предлагаешь для ws только один инстанс держать?
Aleksand
Но ведь и http и ws одинаково скалируются по нодам. Или ты предлагаешь для ws только один инстанс держать?
я к тому что ws - это другой локейшен и там поведение другое по идее, там логика и конфигурация в общем случае другая, и там нечего прибивать, там сессия атомарная на уровне tcp, соединение там одно, а прибивать надо согласование коннекта и это http, один на получение "оффера" второй со свитчем протокола
KlonD90
так это sticky на другой локейшен, он http же
Там протокол такой что сначала клиент высылает список доступного транспорта по хттп и получает сессию. Затем если он умеет в ws делает запрос. Второй запрос должен прийти туда же куда и первый
Vint
Вот, @klond90 уже ответил за меня.
Aleksand
Там протокол такой что сначала клиент высылает список доступного транспорта по хттп и получает сессию. Затем если он умеет в ws делает запрос. Второй запрос должен прийти туда же куда и первый
скажем так ниже первого, ip-hash (sticky это левый модуль и нужен был когда хэш был платным) тут нужен только чтобы второй запрос http пришел туда же с кем был согласован (хотя это не принципиально при идентичности нод), а вот для ws ip-hash смысла не имеет
Aleksand
Контекст
а какой? если ноды одинаковые у тебя? в согласовании есть контекст важный?
Vint
а какой? если ноды одинаковые у тебя? в согласовании есть контекст важный?
Сокетный коннект должен быть там, где рукопожались. Иначе он невалиден.
Aleksand
Сокетный коннект должен быть там, где рукопожались. Иначе он невалиден.
рукопожатие происходит после переключения протокола 101 кодом, это уже другой локейшен
Aleksand
/socket.io/1/?t=1498750249900 _2sK1RZS1Nku7vy0be6o:60:60:websocket где тут контекст который нельзя терять? я запросил согласование протоколов у любой ноды сокетио, они все одинаковые (что должно быть), я могу идти на любую и это сделает nginx на уровне http через ip-hash, если это все один клиент, ws это абстракция другого уровня
Vint
Да более того, можно http вообще избежать, если сразу использовать транспорт websocket. Но ip-hash даже в этом случае нужен для sticky.
Aleksand
Да более того, можно http вообще избежать, если сразу использовать транспорт websocket. Но ip-hash даже в этом случае нужен для sticky.
да нет же, почитай RFC WebSockets, этот протокол инициируется через HTTP/1, и только. HTTP/2 не поддерживается, логика обмена данными после переключения через Upgrade меняется и соединение поддерживается постоянно за счет сердцебиения, при пересоздании его опять инициируется HTTP-запрос который через ip-hash отправляется туда же, а вот пакеты в рамках Websockets протокола уже не балансируются, потому что это атомарное соединение созданное через HTTP
Aleksand
в терминах nginx, sticky это альтернативное название ip-hash, то был бесплатный модуль самописный, он уже не нужен
Vint
Http нужен, если ты сразу хочешь старенький polling, а сервер и браузер соглашаются на websocket
Aleksand
Окей. А что использовать вместо?
ip-hash, он бесплатный, но для socket.io он в целом не обязательный, но можно и использовать. но это уровень абстракции HTTP, а не WS
Vint
Про балансировку пакетов никто и не говорит. Балансировка только сокет-соединений между нодами.
Vint
ip-hash, он бесплатный, но для socket.io он в целом не обязательный, но можно и использовать. но это уровень абстракции HTTP, а не WS
Я тебя не понимаю, извини. У меня есть N нод (с сокетами и одинаковой логикой). Что ты предлагаешь для балансировки сокет-соединений между ними? В рамках nginx.
Aleksand
Http нужен, если ты сразу хочешь старенький polling, а сервер и браузер соглашаются на websocket
ты наверное про SSE? его кстати хотлоадер реактовый использует
Vint
ты наверное про SSE? его кстати хотлоадер реактовый использует
Нет, я в целом, без завязки на реализацию фронта.
Aleksand
Я тебя не понимаю, извини. У меня есть N нод (с сокетами и одинаковой логикой). Что ты предлагаешь для балансировки сокет-соединений между ними? В рамках nginx.
вообще я предлагаю разобраться в подробностях протоколов, это будет полезно очень. потому что сокет-соединения невозможно балансировать, это соединения создающиеся в количестве одна штука на одну сессию, нужно балансировать http, потому что на ws никто не приходит, все приходят на http и его поднимают до ws
Aleksand
Спасибо. Но я выше уже привёл кейс с табами браузера. Разные tcp-соединения.
в этом случае ip-hash отправит все эти соединения на одну ноду
Vint
в этом случае ip-hash отправит все эти соединения на одну ноду
Да ладно?) А о чём речь тогда во всю эту портянку выше? В итоге пришли к ip-hash...
Aleksand
Да ладно?) А о чём речь тогда во всю эту портянку выше? В итоге пришли к ip-hash...
к тому что ip-hash это про http (ну или udp или что-то из tcp не http), а не про ws, это разные протоколы и ws возможен только через http/1, это важно различать
Vint
к тому что ip-hash это про http (ну или udp или что-то из tcp не http), а не про ws, это разные протоколы и ws возможен только через http/1, это важно различать
Но мы за реальные вещи, а не теорию. В итоге сокет-соединение будет там же, куда пришёл http. За балансировку http отвечает nginx с ip-hash. А он (ip-hash) куцый по возможностям в бесплатной версии. Это то, о чём я говорил в самом начале, и то, на чём мы останавливаемся) Хех.
Aleksand
> А он (ip-hash) куцый по возможностям в бесплатной версии. чем это? у nginx нет ограниченных фич насколько я знаю, либо опция платная либо нет
Aleksand
более того кроме ip_hash можно использовать и кастомный хэш
Vint
> А он (ip-hash) куцый по возможностям в бесплатной версии. чем это? у nginx нет ограниченных фич насколько я знаю, либо опция платная либо нет
Да, пардон, я может неправильно выразился изначально, чем сбил с толку. В N+ куча плюшек для балансировки помимо ip-hash
Vint
Aleksand
http://nginx.org/ru/docs/http/ngx_http_upstream_module.html#ip_hash
Aleksand
в мануале сокетио как раз разумно и указывают на его использование, он работает как нужно, без проблем и ограничений
Aleksand
спасибо Игорю, все самое насущное и нужное они публикуют великодушно бесплатно, так что из балансировки только тонкости мелкие платные
Vint
Без проблем и ограничений, но и без возможности тюнинга. Равномерность без развесовки.
Vladimir
Ну-ка, ну-ка
Vladimir
Что там?