170 похожих чатов

Привет. Может кто-нибудь поделиться исчерпывающей статьей или докой о том,

как node.js хендлит так много соединений в одно время? Под хендлингом я имею в виду поддержание.

37 ответов

16 просмотров

это тебе про event loop читать надо и понимать, зачем он и как работает)

Alexey- Автор вопроса

Про v8 я то все знаю. Но это всего лишь рантайм для джса. Мне не понятно как node js держит большое кол-во соединений, имея ограничененное кол-во ядер

В ноде ио операциями заниматься либъюви

Alexey- Автор вопроса

А каким образом libuv хендлит соединения?

https://nodejs.org/en/docs/meta/topics/dependencies/

есть специальные системные вызовы для эффективной работы с большим числом соединений, на разных осях разные, для линукса можно погуглить epoll

Alexey- Автор вопроса

Мне пока тяжело осознавать материал на низком уровне. Мне скорее хотелось бы пройтись по верхам(более-менее абстрактно). Например, предполагается, что node.js сервер со всеми своими зависимостями умеет держать 40к соединений одновременно. Мне понятно, как выполняются операции на уровне v8 для каждого из запросов, но не понятно как libuv держит эти 40к соединений в абстракции. Вычитал, что libuv предоставляет thread pool и 4х(вроде) тредов, готовые выполнять i/o операции. Используются ли эти треды из тредпула libuv для поддержания сетевых соединений, или используется какая-то другая сущность? Понятно, что мне стоит перелопатить всю доку libuv, но чую будет тяжело понять библиотеку концептуально, если нырять сразу в нее.

да хоть в один тред можно опрашивать, там асинхронная работа с подключениями

Alexey- Автор вопроса

А чем обусловлено максимальное кол-во одновременных соединений?

память на состояние tcp-подключения расходуется

Alexey- Автор вопроса

т.е. для вертикального масштабирования в целях поддержания бОльшего кол-во соединений достаточно лишь увеличить кол-во RAM?

в целом да, но могу что-то упускать, сам не занимался

Alexey- Автор вопроса

Понял, спасиб)

Вообще, сетью занимается операционная система. Сверху libuv, потом нода. Так что бери акваланг, если уж так глубоко собрался погружаться 😉

Alexey- Автор вопроса

Да уж, придется) С nginx как-то проще было, куча доступной инфы по тому, как хендлится большое кол-во запросов. Без низкоуровневой конкретики на уровне железок. Для nodejs+libuv таких пока не нашел

А вам точно nodejs для этого нужен? 😏

Alexey- Автор вопроса

А у меня нет задачи) Я лишь пытаюсь понять как libuv аллоцирует ресурсы под новые соединения, и как их держит, и соответственно, понять, почему оказалось так, что веб сервер на ноде так хорош для сервисов с большим кол-вом соединений

Так нгинкс ещё лучше.

Лучше бы вы с таким интересом на Rust/Golang/C++ интересовались и как они хороши, а не тратили свое время на nodejs 😅

Alexey- Автор вопроса

Не спорю, мне лишь интересно как оно уот так уот работает

классические серверы используют синхронную работу с сокетами, из-за этого вынуждены выделять по отдельному потоку на соединение, отсюда все проблемы

Alexey- Автор вопроса

А я джаваскриптизер, который пытается лучше понимать свои инструменты

Alexey- Автор вопроса

Несомненно)

Ну просто вы задаете вопросы не связанные с яваскриптом вообще никак)))) А на ваши вопросы лучше ответит более глубокое изучение перечисленных мной выше языков, вы вообще откроете для себя очень многое, а не только конкретную реализацию чего бы то нибыло 😉

Может и не нужно туда копать? Отличительной особенностью ноды была её асинхронность в отличии от пхп. В этом была фишка скорости. Фишка как раз в том чтоб писать код на жс и не вникать в дебри.

Alexey- Автор вопроса

Думаю, что стоит. Как минимум для понимания того, где сервер на ноде будет упираться в ограничения и почему

+

Но это всё с нодой уже действительно не связано. Это конечно полезно, но без этого жаваскриптизеру можно жить. В этом и смысл ноды. Иначе тебе нужно поинтересоваться как работает сети, ос, познакомиться с си и так далее.

Alexey- Автор вопроса

Наверное я не дал себя правильно понять) Я взял nodejs, начал ковыряться почему он так хорошо справляется с кучей параллельных соединений. Наткнулся на libuv. Пытаюсь понять, для начала, почему libuv концептуально(без низкоуровневых дебрей) так хорошо справляется с обработкой соединений. Понял, что в отличие от мультитредовых сред, под каждое соединение(как говорилось ранее), не выделяется куча ресурсов под поток для каждого соединения. Теперь встал вопрос: как libuv работает с соединениями в одном треде. После понимания этого вопроса я уже точно дальше не полезу)

Как разберешься — напиши.

Alexey- Автор вопроса

👍

Да, логику вашего размышления я понял. Просто то что вы узнали не даст вам полного понимания происходящего, мне потому и хотелось вам всучить изучение низкоуровневого языка))) Простите, если был настойчив))

Alexey- Автор вопроса

Я благодарен совету, и он точно отложился)

+

Я не спец, но сокеты имеют флаг при создании, который переводит их в неблокируемый режим. Соответсвенно основной поток уже не блокируется, и треды вам уже не нужны. ОС (или хз что) по идее оповещает приложение о новых данных. Ну или приложение само время от времени запрашивает новые данные из сокета.

там же выше уже подсказали - через epoll (это под линукс, а винда, насколько понимаю, просто предоставляет асинхронный api без выделения для него особого названия) тут нет никакой особой магии, это просто использование возможностей ос

магия только на уровне ядра ос как она так устройства эффективно опрашивает))

Похожие вопросы

Обсуждают сегодня

Мужики и девушки, привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных...
Kraszx
14
Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
как быть с принтером? такой подход прокатит?
zamtmn
12
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
А вот это что за конструкция? Вернее, она тут нафига?
Serjone
10
Привет. Подскажите, как правильно сматчить лист фиксированного размера, чтобы компилятор не говорил мне о неполном паттерне? Допустим что-то такое [x', y'] = sort [x, y]?
Arseny
8
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
Мужики. привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных элементов...
Kraszx
2
Карта сайта