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

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

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

37 ответов

14 просмотров

это тебе про 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 без выделения для него особого названия) тут нет никакой особой магии, это просто использование возможностей ос

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

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
Кибер Бомж
8
Карта сайта