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

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

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

37 ответов

17 просмотров

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

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта