как node.js хендлит так много соединений в одно время? Под хендлингом я имею в виду поддержание.
это тебе про event loop читать надо и понимать, зачем он и как работает)
Про v8 я то все знаю. Но это всего лишь рантайм для джса. Мне не понятно как node js держит большое кол-во соединений, имея ограничененное кол-во ядер
В ноде ио операциями заниматься либъюви
А каким образом libuv хендлит соединения?
https://nodejs.org/en/docs/meta/topics/dependencies/
есть специальные системные вызовы для эффективной работы с большим числом соединений, на разных осях разные, для линукса можно погуглить epoll
Мне пока тяжело осознавать материал на низком уровне. Мне скорее хотелось бы пройтись по верхам(более-менее абстрактно). Например, предполагается, что node.js сервер со всеми своими зависимостями умеет держать 40к соединений одновременно. Мне понятно, как выполняются операции на уровне v8 для каждого из запросов, но не понятно как libuv держит эти 40к соединений в абстракции. Вычитал, что libuv предоставляет thread pool и 4х(вроде) тредов, готовые выполнять i/o операции. Используются ли эти треды из тредпула libuv для поддержания сетевых соединений, или используется какая-то другая сущность? Понятно, что мне стоит перелопатить всю доку libuv, но чую будет тяжело понять библиотеку концептуально, если нырять сразу в нее.
да хоть в один тред можно опрашивать, там асинхронная работа с подключениями
А чем обусловлено максимальное кол-во одновременных соединений?
память на состояние tcp-подключения расходуется
т.е. для вертикального масштабирования в целях поддержания бОльшего кол-во соединений достаточно лишь увеличить кол-во RAM?
в целом да, но могу что-то упускать, сам не занимался
Понял, спасиб)
Вообще, сетью занимается операционная система. Сверху libuv, потом нода. Так что бери акваланг, если уж так глубоко собрался погружаться 😉
Да уж, придется) С nginx как-то проще было, куча доступной инфы по тому, как хендлится большое кол-во запросов. Без низкоуровневой конкретики на уровне железок. Для nodejs+libuv таких пока не нашел
А вам точно nodejs для этого нужен? 😏
А у меня нет задачи) Я лишь пытаюсь понять как libuv аллоцирует ресурсы под новые соединения, и как их держит, и соответственно, понять, почему оказалось так, что веб сервер на ноде так хорош для сервисов с большим кол-вом соединений
Так нгинкс ещё лучше.
Лучше бы вы с таким интересом на Rust/Golang/C++ интересовались и как они хороши, а не тратили свое время на nodejs 😅
Не спорю, мне лишь интересно как оно уот так уот работает
классические серверы используют синхронную работу с сокетами, из-за этого вынуждены выделять по отдельному потоку на соединение, отсюда все проблемы
А я джаваскриптизер, который пытается лучше понимать свои инструменты
Несомненно)
Ну просто вы задаете вопросы не связанные с яваскриптом вообще никак)))) А на ваши вопросы лучше ответит более глубокое изучение перечисленных мной выше языков, вы вообще откроете для себя очень многое, а не только конкретную реализацию чего бы то нибыло 😉
Может и не нужно туда копать? Отличительной особенностью ноды была её асинхронность в отличии от пхп. В этом была фишка скорости. Фишка как раз в том чтоб писать код на жс и не вникать в дебри.
Думаю, что стоит. Как минимум для понимания того, где сервер на ноде будет упираться в ограничения и почему
+
Но это всё с нодой уже действительно не связано. Это конечно полезно, но без этого жаваскриптизеру можно жить. В этом и смысл ноды. Иначе тебе нужно поинтересоваться как работает сети, ос, познакомиться с си и так далее.
Наверное я не дал себя правильно понять) Я взял nodejs, начал ковыряться почему он так хорошо справляется с кучей параллельных соединений. Наткнулся на libuv. Пытаюсь понять, для начала, почему libuv концептуально(без низкоуровневых дебрей) так хорошо справляется с обработкой соединений. Понял, что в отличие от мультитредовых сред, под каждое соединение(как говорилось ранее), не выделяется куча ресурсов под поток для каждого соединения. Теперь встал вопрос: как libuv работает с соединениями в одном треде. После понимания этого вопроса я уже точно дальше не полезу)
Как разберешься — напиши.
👍
Да, логику вашего размышления я понял. Просто то что вы узнали не даст вам полного понимания происходящего, мне потому и хотелось вам всучить изучение низкоуровневого языка))) Простите, если был настойчив))
Я благодарен совету, и он точно отложился)
+
Я не спец, но сокеты имеют флаг при создании, который переводит их в неблокируемый режим. Соответсвенно основной поток уже не блокируется, и треды вам уже не нужны. ОС (или хз что) по идее оповещает приложение о новых данных. Ну или приложение само время от времени запрашивает новые данные из сокета.
там же выше уже подсказали - через epoll (это под линукс, а винда, насколько понимаю, просто предоставляет асинхронный api без выделения для него особого названия) тут нет никакой особой магии, это просто использование возможностей ос
магия только на уровне ядра ос как она так устройства эффективно опрашивает))
Обсуждают сегодня