Node.js的事件驱动有什么不同? 我们不能在ASP.Net的HttpAsyncHandler中做到这一点吗?

我在networking编程方面并不是很有经验,而且我也没有在Node.js中编写任何代码,只是对事件驱动的方法感到好奇。 这看起来不错。

文章解释了当我们使用基于线程的方法来处理请求时可能发生的一些不好的事情,而应该select事件驱动的方法。 在基于线程的情况下,收银员/线程与我们卡在一起,直到我们的食物/资源准备就绪。 在事件驱动下,收银员会将我们发送到请求队列中的某个地方,这样我们就不会在等待我们的食物时阻止其他请求。 要扩展基于线程的阻塞,您需要增加线程的数量。 对我来说,这似乎是不正确地使用线程/线程池的一个不好的借口。

不能正确处理使用IHttpAsyncHandler? ASP.Net接收一个请求,使用ThreadPool并运行处理程序(BeginProcessRequest),然后在里面我们用一个callback加载文件/数据库。 该线程应该可以自由处理其他请求。 一旦文件读取完成,ThreadPool就会被再次调用并执行剩下的响应。 对我来说不是那么不同,为什么这不是可扩展的?

我所知道的基于线程的一个缺点是,使用线程需要更多的内存。 但只有这些,你才能享受到多核的好处。 我怀疑Node.js根本没有使用任何线程/内核。

所以,基于事件驱动和基于线程的(不要带“因为它是Javascript和每个浏览器…”的说法),有人可以指出使用Node.js的实际好处,而不是现有的技术?

这是一个长期的问题。 谢谢 :)

首先,Node.js不是multithreading的。 这个很重要。 你必须成为一个非常有才华的程序员,来devise在线程环境中完美工作的程序。 线程只是很难。

你必须成为一个上帝来维护一个线程项目,它没有正确devise。 在非常大的项目中,难以避免的问题太多了。

其次,整个平台被devise为asynchronous运行。 你有没有看到每个单一的IO交互asynchronous的任何ASP.NET项目? 简单地说,ASP.NET不是被devise成事件驱动的。

然后,由于我们每个开放连接有一个线程和整个缩放问题,所以存在内存占用。 纠正我,如果我错了,但我不知道你将如何避免在ASP.NET中的每个连接创build一个新的线程。

另一个问题是Node.js请求在没有被使用或者在等待IO的时候是空闲的。 另一方面,一个C#线程睡觉。 现在,这些线程可以睡眠的数量是有限的。 在Node.js中,您可以在一台开发机器上同时轻松处理10k个客户端。 您尝试在一台开发机器上并行处理10k个线程。

JavaScript本身作为一种语言使asynchronous编码更容易。 如果你仍然在C#2.0中,那么asynchronous语法是一个真正的痛苦。 如果你定义了Action<>Function<>并且使用callbackFunction<>很多开发人员会感到困惑。 以一种平衡的方式编写的ASP.NET项目,普通ASP.NET开发人员无法维护。

至于线程和核心。 Node.js是单线程的,通过创build多节点进程来进行扩展。 如果你有一个16核心,那么你运行你的node.js服务器的16个实例,并在它前面有一个Node.js负载平衡器。 (如果你愿意,也许是一个nginx负载平衡器)。

这些都是从一开始就以低级的方式写入平台的。 这不是一些function在后来的下滑。

其他优点

Node.js上面有更多的东西。 以上只是为什么Node.js处理事件循环的方式比在ASP.NET中使用asynchronousfunction更好。

  • 性能。 它很快。 真的很快
  • Node.js的一个很大的优势是它的底层API。 你有很多的控制。
  • 您将整个HTTP服务器直接集成到您的代码中,然后外包给IIS。
  • 你有整个nginx与Apache的比较。
  • 整个C10K挑战由节点处理,而不是由IIS处理
  • AJAX和JSON通信感觉自然而轻松。
  • 实时通信是关于Node.js的重大事情之一。 这是为了它。
  • 与基于文档的nosql数据库很好地玩。
  • 也可以运行一个TCP服务器。 可以做文件写入访问,可以在服务器上运行任何的unix console命令。
  • 您可以使用CouchDB和map / reduce在javascript中查询数据库。 你用JavaScript写你的客户端。 在您的Web堆栈上开发时没有上下文切换。
  • 丰富的社区驱动的开源模块。 node.js中的所有东西都是开源的。
  • 占地面积小,几乎没有依赖性。 您可以自己构buildnode.js源文件。

Node.js的缺点

这个很难(硬。 这是年轻的。 作为一名熟练的 JavaScript开发人员,我仅仅因为Node.js的低级特性和控制水平而面临困难。 这感觉就像是C.很多的灵活性和力量要么用于我或挂我。

该API不被冻结。 它正在迅速变化。 我可以想象,由于Node.js会在5年内完全改写,因此需要在5年内完全重写一个大型网站。 这是可行的,你只需要知道在node.js网站上维护并不便宜。

进一步阅读

http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

http://blip.tv/file/2899135

http://nodeguide.com/

关于node.js与ASP.Net和asynchronous编程有很多误解。 您可以在ASP.NET中执行非阻塞IO 。 大多数人不知道.Net框架在使用 .NET 2.0及以上版本的开始/结束模式进行Web服务调用或其他I / O绑定操作时,会使用Windows iocompletion端口 。 IO完成端口是Windows操作系统支持非阻塞IO的方式,以便为IO操作完成而释放应用程序线程。 有趣的是,node.js通过Cygwin在Windows中使用不太理想的非阻塞IO实现。 路线图上有一个新的Windows版本,微软的指导将使用IO完成端口。 那时候没有什么区别。

也可以在ADO.NET中进行非阻塞数据库调用,但要注意ORM工具,比如NHibernate和Entity Framework。 他们仍然非常同步。

同步IO(阻塞)使控制stream程更加清晰,并因此而变得stream行。 计算机环境是multithreading的原因只是表面上与此有关。 更一般地讲,涉及到多个CPU的时间共享和利用。

只有一个线程可能在长时间的操作中导致饥饿,这可能与IO和复杂的计算有关。 所以,即使经验法则是一个线程公关。 核心在利用非阻塞IO时,仍然应该考虑足够的线程池大小,以便简单的请求不会被更复杂的操作饿死(如果存在的话)。 multithreading还允许复杂的操作在多个CPU之间轻松拆分。 像node.js这样的单线程环境只能通过更多的进程和消息传递来协调行动,才能利用多核处理器。

我个人还没有看到任何引人注目的理由来引入一个额外的技术,如node.js。 然而,可能有很好的理由,但在我看来,它们与通过非阻塞IO服务大量连接无关,因为这也可以通过ASP.NET来完成。

BTW tamejs可以帮助你的nodejs代码更具可读性,类似于即将推出的.Net Async CTP。

很容易低估Node.js和ASP.NET社区之间的文化差异 。 当然,IHttpAsyncHandler已经存在了 ,它已经在.NET 1.0中出现了,所以它甚至可能是好的,但是关于Node.js的所有代码和讨论都是关于asynchronousI / O的,但是当涉及到.NET时决不是这种情况。 想使用LINQ To SQL? 你有点儿可以 。 要logging的东西? 也许“CSharp DotNet Logger”也许可以工作 。

所以是的,IHttpAsyncHandler在那里,如果你真的很小心,你可能会写一个事件驱动的Web服务,而不会跳过某些阻塞I / O的地方,但我真的没有很多人使用的印象它(当然不是编写ASP.NET应用程序的主要方式)。 相比之下,Node.js是关于I / O,所有代码示例,所有库以及人们使用它的唯一方式。 所以,如果你打赌哪一个的I / O模型实际上一直工作,Node.js可能是一个挑选的人。

根据当前时代的技术改进和阅读下面的链接,我可以说,这是专业的问题,并根据特定的情况select完美的组合。 NodeJS越来越成熟,ASP.NET方面我们有ASP.NET MVC,WebAPI和SignalR等,使事情变得更好。

Node.js与.Net的性能

http://www.salmanq.com/blog/net-and-node-js-performance-comparison/2013/03/和;

http://www.hanselman.com/blog/InstallingAndRunningNodejsApplicationsWithinIISOnWindowsAreYouMad.aspx

谢谢。