Чем отличается узел.JS-управляемый событиями? Разве мы не можем сделать это в ASP.Net-Хттпасынчандлер?
Я не очень опытный в веб-программировании, и я на самом деле ничего не закодировал в узле.js еще, просто любопытно о событийный подход. Это действительно кажется хорошим.
в статье объясняются некоторые плохие вещи, которые могут произойти, когда мы используем потоковый подход для обработки запросов, и вместо этого должны выбрать событийный подход. В потоковой основе кассир / поток застрял с нами, пока наша еда / ресурс не будет готов. Находясь в событийном режиме, кассир отправьте нас куда-нибудь из очереди запросов, чтобы мы не блокировали другие запросы во время ожидания нашей еды. Чтобы масштабировать блокирующий поток на основе, необходимо увеличить количество потоков. Мне это кажется плохим оправданием для не использования потоков/threadpools должным образом.
не может ли это быть правильно обработано с помощью IHttpAsyncHandler? ASP.Net получает запрос, использует ThreadPool и запускает обработчик (BeginProcessRequest), а затем внутри него мы загружаем файл/базу данных с обратным вызовом. Что Затем поток должен быть свободен для обработки других запросов. После завершения чтения файла пул потоков снова вызывается в действие и выполняет оставшийся ответ. Не так отличается для меня, так почему же это не так масштабируемо?
один из недостатков потоковой базы, который я знаю, заключается в том, что для использования потоков требуется больше памяти. Но только с ними вы можете пользоваться преимуществами нескольких ядер. Я сомневаюсь в узле.js не использует никаких потоков/ядер вообще.
Итак, основываясь только на управляемый событиями vs потоковый (не приносите "потому что это Javascript и каждый браузер..."аргумент), может кто-то указать мне, что такое фактическое преимущество использования узла.js вместо существующей технологии?
Это был длинный вопрос. Спасибо :)
4 ответа:
прежде всего, узел.js не является многопоточным. Это очень важно. Вы должны быть очень талантливым программистом, чтобы разрабатывать программы, которые отлично работают в потоковой среде. Нити просто жесткие.
вы должны быть черт для поддержания резьбового проекта, где он не был разработан должным образом. Есть просто так много проблем, которые могут быть трудно избежать в очень больших проектах.
во-вторых, вся платформа была разработана для асинхронного запуска. Иметь вы видите любой ASP.NET проект, где каждое взаимодействие IO было асинхронным? проще говоря, ASP.NET не был разработан, чтобы быть управляемым событиями.
тогда есть объем памяти из-за того, что у нас есть один поток на открытое соединение и вся проблема масштабирования. Поправьте меня, если я ошибаюсь, но я не знаю, как вы могли бы избежать создания нового потока для каждого соединения в ASP.NET.
другая проблема заключается в том, что узел.запрос js простаивает, когда он не используется или когда он жду ИО. С другой стороны, поток C# спит. Сейчас существует ограничение на количество этих потоков, которые могут спать. в узлах.ДЖС, вы можете легко отрегулировать клиентов 10к в то же время параллельно на одной машине развития. Вы пытаетесь обрабатывать 10k потоков параллельно на одной машине разработки.
сам JavaScript как язык упрощает асинхронное кодирование. Если вы все еще находитесь в C# 2.0, то асинхронный синтаксис-настоящая боль. Многие разработчики просто запутаются, если вы определяете
Action<>
иFunction<>
повсюду и с помощью обратных вызовов. Ан ASP.NET проект, написанный ровным способом, просто не поддерживается средним ASP.NET разработчик.что касается потоков и ядер. Узел.js является однопоточным и масштабируется путем создания процессов с несколькими узлами. Если у вас есть 16 ядер, то вы запускаете 16 экземпляров вашего узла.JS сервер и имеют один узел.JS балансировщик нагрузки перед ним. (Возможно, балансировщик нагрузки nginx, если вы хотите).
все это было написана на платформе на очень низком уровне с самого начала. Это не было какой-то функциональностью, закрепленной позже по линии.
другие преимущества
узел.js имеет гораздо больше к нему, чем выше. Выше только почему узел.способ обработки цикла событий js лучше, чем делать это с асинхронными возможностями в ASP.NET.
- производительность. Это быстро. Очень быстро.
- одно большое преимущество узла.JS-это его низкий уровень ПРИКЛАДНОЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС. У вас есть много контроля.
- у вас есть весь HTTP-сервер, интегрированный непосредственно в ваш код, а затем переданный на аутсорсинг в IIS.
- у вас есть все сравнение nginx против Apache.
- весь вызов C10K хорошо обрабатывается узлом, но не IIS
- AJAX и JSON связь чувствует себя естественно и легко.
- связь в реальном времени является одним из самых больших вещей о узле.js. Он был создан для этого.
- играет хорошо с документальными базами данных nosql.
- также можно запустить TCP-сервер. Может делать доступ к записи файлов, может запускать любую консольную команду unix на сервере.
- вы запрашиваете свою базу данных в javascript, используя, например, CouchDB и map/reduce. Вы пишете свой клиент на JavaScript. Во время разработки в вашем веб-стеке нет переключателей контекста.
- богатый набор модулей с открытым исходным кодом, управляемых сообществом. Все в узле.JS является открытым исходным кодом.
- небольшой след ноги и почти никакие зависимости. Вы можете построить узел.с JS кодом себе.
недостатки узла.js
это тяжело. Он молодой. Как опытный разработчик JavaScript, я сталкиваюсь с трудностями при написании веб-сайта с узлом.js просто из-за его низкоуровневой природы и уровня контроля, который у меня есть. Он чувствует себя так же, как C. много гибкости и власти либо использовать для меня, либо повесить меня.
API не заморожен. Это быстро меняется. Я могу себе представить, что придется полностью переписать большой сайт за 5 лет из-за узла количества.js будет изменен к тому времени. Это возможно, вы просто должны знать, что обслуживание на узле.JS сайты не дешево.
далее чтение
http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/
есть много заблуждений относительно узла.Яш и ASP.Net и асинхронное программирование. Вы можете сделать не блокируя IO in ASP.NET. Большинство людей не знают, что.Net framework использует порты завершения Windows внизу, когда вы выполняете вызовы веб-служб или другие операции ввода-вывода, связанные с использованием шаблона begin/end в .Net 2.0 и выше. Порты завершения ввода-вывода-это способ, которым операционная система Windows поддерживает неблокирующий ввод-вывод, так что поток приложения освобождается почему операция ввода-вывода завершена. Интересно, что узел.js использует менее оптимальную неблокирующую реализацию ввода-вывода в Windows через Cygwin. Новая версия Windows находится на Дорожной карте, которая с руководством Microsoft будет использовать порты завершения ввода-вывода. В этот момент нет никакой разницы.
также можно выполнять неблокирующие вызовы базы данных ADO.NET но помните о таких инструментах ORM, как NHibernate и Entity Framework. Их еще очень много синхронный.
синхронный ввод-вывод (блокирование) делает поток управления намного более четким, и по этой причине он стал популярным. Причина, по которой компьютерные среды многопоточны, имеет только поверхностное отношение к этому. Это в более общем плане связано с разделением времени и использованием нескольких процессоров.
наличие только одного потока может вызвать голодание во время длительных операций, которые могут быть связаны как с IO, так и со сложными вычислениями. Итак, даже если эмпирическое правило одна нить пр. ядро при использовании неблокирующего ввода-вывода следует по-прежнему учитывать достаточный размер пула потоков, чтобы простые запросы не голодали более сложными операциями, если таковые существуют. Несколько потоков также позволяет легко разделить сложные операции между несколькими процессорами. Однопоточная среда, такая как узел.js может использовать только многоядерные процессоры через больше процессов и передачи сообщений для координации действий.
лично я пока не видел ни одного убедительного аргумента ввести дополнительную технологию такого узла.js. Тем не менее, могут быть веские причины, но они, на мой взгляд, мало связаны с обслуживанием большого количества соединений через неблокирующий IO, поскольку это также можно сделать с помощью ASP.NET.
BTW tamejs может помочь сделать ваш код nodejs более читаемым, похожим на новый предстоящий .Net Async CTP.
легко занизить культурные различия между узлом.js и ASP.NET сообщества. Конечно, IHttpAsyncHandler и это было вокруг с .NET 1.0, так что это может быть даже хорошо, но весь код и обсуждение вокруг узла.js - это асинхронный ввод-вывод, который явно не тот случай, когда дело доходит до .NET. хотите использовать LINQ to SQL? ты вроде как можешь, вид. Хотите, чтобы войти вещи? может быть, "CSharp DotNet Logger" будет работать, возможно.
Так что да, IHttpAsyncHandler есть, и если вы действительно осторожны, вы можете написать веб-сервис, Управляемый событиями, не спотыкаясь о какой-то блокирующий ввод/вывод где-то, но у меня действительно не складывается впечатление, что многие люди используют его (и это, конечно, не лучший способ для написания ASP.NET приложения). Напротив, узел.js - это все о evented I / O, все примеры кода, все библиотеки, и это единственный способ, которым люди используют его. Так что если бы вы собирались поставить на что одна из моделей evented I / O на самом деле работала полностью, узел.Джей, вероятно, будет тем, кто выберет.
в соответствии с текущими возрастными технологическими улучшениями и чтением ниже ссылок, я могу сказать, что это вопрос опыта и выбора идеального сочетания в соответствии с конкретным сценарием, который имеет значение. NodeJS становится зрелым и ASP.NET сторона у нас есть ASP.NET MVC, WebAPI, и SignalR etc. чтобы все стало лучше.
узел.Яш против .Чистая производительность
http://www.salmanq.com/blog/net-and-node-js-performance-comparison/2013/03/ и
http://www.hanselman.com/blog/InstallingAndRunningNodejsApplicationsWithinIISOnWindowsAreYouMad.aspx
спасибо.