Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Подходит ли node для высоконагруженных серверов? (https://javascript.ru/forum/misc/50643-podkhodit-li-node-dlya-vysokonagruzhennykh-serverov.html)

petya 05.10.2014 18:10

Подходит ли node для высоконагруженных серверов?
 
Ходят слухи, что node, благодаря своей асинхронности, идеально подходит для высоконагруженных серверов. Но ведь асинхронность означает только то, что сервер без задержек принимает запросы. JS однопоточен, соответственно,отдает он их в порядке очереди, и, если в очереди дофига запросов, то последний клиент поседеет, пока дождется ответа. Это, по-сути, еще хуже, чем в многопоточной модели, там хоть, все клиенты на равных правах находятся. А тут получается, что один запрос вешает всю очередь. Тут надо бы что-то получше придумать, не?

Erolast 05.10.2014 19:07

Подходит.

MallSerg 05.10.2014 19:14

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

petya 05.10.2014 19:21

Цитата:

Сообщение от MallSerg
Вопрос свидетельствует лишь о том что петя даже отдаленно не представляет как работает компьютер.

Я не буду спорить, но хотелось бы конкретики, а именно, что из сказанного мной об этом свидетельствует. Иначе это кукареку от очередного кукарекушки.

danik.js 05.10.2014 19:23

Что вы, он прекрасно разбирается в высоконагруженных проектах.
Вот, доказал, что вызов array_chunk в php может погубить вебсайт.

petya 05.10.2014 19:24

Erolast,
Я ознакомлюсь со ссылкой, позже, но миллион одновременных соединений сам по себе, ничего не говорит. Ну построили мы очередь из миллиона запросов, и что? Их еще надо обработать.

petya 05.10.2014 19:26

danik.js,
Да, я доказал, только не это, а то, что только д*бы производят вычисления на сервере, когда их можно делать на клиенте. Жаль только, что ты них*я не понял.

danik.js 05.10.2014 19:31

petya, а нах ты вобще генеришь html на сервере? кидай шаблон и данные клиенту - пущай сам себе генерит. И все кто так не делает - д*бы.

petya 05.10.2014 19:33

danik.js,
А так щас и делается, че ты тут америку открываешь. То что в конторе Васи Пупкина генерят документы на сервере еще не означает, что так надо делать.

danik.js 05.10.2014 19:43

petya, покажи свои проекты, где ты именно так и делаешь? Ты же так делаешь? Или ты д*б?

petya 05.10.2014 19:44

danik.js,
Я тебе обязан что-то показывать или доказывать? Гуляй.

MallSerg 05.10.2014 19:48

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

petya 05.10.2014 19:51

Цитата:

Сообщение от danik.js
кидай шаблон и данные клиенту - пущай сам себе генерит

И, само собой не так как ты думаешь. Страница собирается ajax'ом, а это бред сивой кобылы.

petya 05.10.2014 19:55

MallSerg,
Во первых, ты запутался в терминах. Ты хотел сказать, что реального параллелизма нет, а есть конкурентность. Это касается не всех машин, но большей части, да. И чо с того? как это соотносится с вопросом?

MallSerg 05.10.2014 20:02

Повторю.
Реальной многозадачности не существует.
Какое из этих слов непонятно.?

petya 05.10.2014 20:03

MallSerg,
А, я понял, ты освоил компьютер для дошкольников, и тебе предоставилась возможность блеснуть знаниями, в этом был смысл твоего поста? Тогда ясно, только почему я должен отвлекаться на это, хз.

petya 05.10.2014 20:04

Цитата:

Сообщение от MallSerg
Какое из этих слов непонятно.?

Я спрашиваю, какое отношение имеет та ахинея, которую ты несешь к сабжу?

kobezzza 05.10.2014 20:07

Зависит от задачи.

Более того, подход non blocking I/O, который использует node можно использовать в огромной количестве других фреймворков на других языках, даже в PHP есть некий PHP Daemon.

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

MallSerg 05.10.2014 20:09


petya 05.10.2014 20:13

MallSerg,
Было бы кого уделывать. Ты вякнул не в кассу какую-то х*ню, никак не связаную с сабжем, и продолжаешь баранится. А связь указать не можешь. Стыдно по-ходу признаться, что просто хотел рисануться, не прокатило, вот беда, и отмаз слепить не получается, приходится обтекать.

MallSerg 05.10.2014 20:13

Цитата:

Сообщение от petya
Я спрашиваю, какое отношение имеет та ахинея, которую ты несешь к сабжу?

Для того что бы объяснить что то нужно что бы индивидум хотя бы отдаленно понимал о чем идет речь иначе складывается ощущение что я пытаюсь объяснить основы геометрии мокаке сидящей на дереве

petya 05.10.2014 20:18

MallSerg,
Я понимаю о чем ты говоришь, у взрослых дядек это называется Ъ-параллелизм vs конкурентность. Кэп нам подсказывает, что один процессор не может в реальном времени производить одновременно несколько вычислений, мы это можем имитировать, епт, дальше что?

MallSerg 05.10.2014 20:48

Дальше идет механизм блокировок IO и прочие
Факт в том что операции ввода вывода блокируют выполнение потока т.е. само приложение останавливает свою работу пока операция ввода вывода не вернет результат при чем не важно что это за операция чтения файла с диска или запрос к базе данных или де передача управления драйверу который рисует картинку на экране

petya 05.10.2014 20:54

MallSerg,
Я упомянул в своем стартовом посте об асинхронности, но асинхроность означает лишь то, что не блокируется основной луп, далее, эти запросы обрабатывается в порядке очереди. А клиенту интересно не только отправить запрос, но и получить ответ на него. Если какой-то из запросов обрабатывается, скажем, 10 секунд, все остальные будут ждать (чего, к слову, не происходит в многопоточных средах).

kobezzza 05.10.2014 21:04

petya, стандартный сценарий:

два пользователя пришли на сервер за данными, нода послал запрос в БД и если для второго пользователя данные пришли раньше, то он их раньше и получит.

Но верно замечено, что если пользователю нужно посчитать число P до какой то невероятной точности, то он просто залочит поток и остановит очередь, вывод: не использовать ноду где нужны сложные вычисления или разбивать их на части и делать постепенно.

Следует заметить, что некоторое подобие потоков можно сделать на основе генераторов, но все таки, если нужны сложные операции с числами или еще чего, то нода плохой вариант.

Т.е. ноду хорошо использовать как прокси: проверил права доступа, сходил в базу, отдал данные или результат шаблона с данными, а большинство типичных веб-проектов в эту схему как раз и входят.

MallSerg 06.10.2014 02:06

Цитата:

Сообщение от petya
процессор не может в реальном времени производить одновременно несколько вычислений

Единственная здравая мысль не совсем корректная но в целом сойдет

Многопоточность это абстракция которая скрывает от пользователя тот факт что по сути выполняется один поток команд в который вносятся дополнительные команды(прерывания) и создаются виртуальные потоки создается впечатление что это разные независимые потоки хотя в реальности это не так называется это вытесняющей многозадачностью

MallSerg 06.10.2014 02:31

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

но у этого подхода также есть множество минусов =(.

MallSerg 06.10.2014 03:11

Цитата:

Сообщение от petya
Ходят слухи, что node, благодаря своей асинхронности, идеально подходит для высоконагруженных серверов. Но ведь асинхронность означает только то, что сервер без задержек принимает запросы. JS однопоточен, соответственно,отдает он их в порядке очереди, и, если в очереди дофига запросов, то последний клиент поседеет, пока дождется ответа. Это, по-сути, еще хуже, чем в многопоточной модели, там хоть, все клиенты на равных правах находятся. А тут получается, что один запрос вешает всю очередь. Тут надо бы что-то получше придумать, не?

по-сути, это означает что сервер не будет простаивать даже при 10 000 одновременных запросов не тратя свои ресурсы на создание 10 000 потоков выделение под них памяти и т.д. в нем не будет 10 000 ждущих ответа от бд или файловой системы.

Асинхронность это не панацея это просто набор правил которые призваны защитить от излишних блокировок выполнения программы так же такой подход позволяет заметно экономить ресурсы системы.

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

Программы/скрипты которые избегают блокировок очень отзывчивы и как правило не заблокированны.

Все это элементарно проверяется простыми тестами.

Erolast 06.10.2014 06:28

Цитата:

Т.е. ноду хорошо использовать как прокси: проверил права
доступа, сходил в базу, отдал данные или результат шаблона с данными, а большинство типичных веб-проектов в эту схему как раз и входят.
..или для игрового сервера. Я вот MUD-движок на нем пишу.

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

petya 07.10.2014 11:48

Цитата:

Сообщение от MallSerg
здравая мысль

здравая мысль в том, что я попросил тебя объяснить, каким образом связана конкурентность с сабжем. Какая разница, имеем ли мы настоящий параллелизм, или конкурентность в контексте рассматриваемого вопроса. Ответа я так и не услышал.

petya 07.10.2014 11:55

kobezzza,
Цитата:

Сообщение от kobezzza
два пользователя пришли на сервер за данными, нода послал запрос в БД и если для второго пользователя данные пришли раньше, то он их раньше и получит.

Да, я понимаю, Это потому что запрос к базе -- асинхронная операция. Она не выполняет никакой работы, после запроса управление тут же возвращается, поиском по базе нода не занимается, она просто потом принимает результат. А я вот что подумал. А почему бы не использовать отдельный процесс(ы) ноды для вычислений? Эффект будет тот же самый, по-идее. Основной процесс будет "делегировать" вычисления другим процессам ноды.

kobezzza 07.10.2014 12:01

Цитата:

А почему бы не использовать отдельный процесс(ы) ноды для вычислений?
http://nodejs.org/api/cluster.html

***

А ещё можно сделать свои потоки:

http://www.youtube.com/watch?v=K2GAANmWTgQ - на примере моей библиотеки https://github.com/kobezzza/Collection

petya 07.10.2014 12:08

kobezzza,
Да, спасибо, это как раз, правильный подход, ящетаю.


Часовой пояс GMT +3, время: 07:51.