2011-04-07 61 views

回答

3

我猜是因为已经有4个月了,你已经得到了答案。不管这里去...

的Netty http://www.jboss.org/netty

米娜 http://mina.apache.org/

C10K http://www.kegel.com/c10k.html

要理解这个问题的一部分事件触发IO正在设法解决看一看的C10K上面的链接。 Scability是io的主要优点之一。

传统的Web服务器将处理一个请求,然后返回一个响应(同步/阻塞)。每个请求通常需要它自己的线程。

事件驱动的Web服务器将处理请求,然后创建事件(异步/非阻塞IO),然后返回响应。多个请求由单个线程/进程共享。

Evented IO应该能够处理比典型Web服务器更多的每个线程请求。你可能不会用加速IO来加速你的Web应用程序,但它应该比传统的Web服务器处理大量的连接要容易得多。这意味着需要较少的机器进行缩放。

虽然我会争辩说,evented io架构会迫使您开发您的web应用程序来处理较小的数据块。就像一个谷歌邮件类型的应用程序,它使用大量Ajax调用来轮询服务器上的数据,然后在浏览器中进行小更新。这本身有很多好处,可以帮助加速并提高服务器的扩展性。

Netty和Mina提供了大量的示例代码。

+0

我很感谢你回答了这个问题,即使它太老也回答。但重要的是它仍然有用。 – Morin 2011-09-08 05:54:42

2

这是一个非常古老的问题,但我认为这可能会帮助一些身体别人理解事件驱动编程:

这以下的比喻可以帮助你了解事件驱动I/O程序通过并行绘制在线等待在医生的接待处。

阻塞I/O就像是,如果你站在队列中,接待员要求你前面的一个人填写表格,她等到他完成。你必须等待轮到他完成他的表格,这是阻止。

如果单身男士需要3分钟才能填写,第10个男士必须等待30分钟。现在为了减少这第十个家伙的等待时间,解决方案是,接待员人数越来越多,这是昂贵的。这是传统Web服务器发生的情况。如果您请求用户信息,则其他用户的后续请求应等待直至当前操作(从数据库获取)完成。这增加了第10个请求的“响应时间”,并且它对于第n个用户呈指数增长。为了避免这种传统的Web服务器为每个请求创建线程(相当于越来越多的接待员),即,基本上它为每个请求创建服务器的副本,这是CPU消耗的高成本间歇,因为每个请求都需要一个操作系统线。要扩展应用程序,您必须在应用程序中投入大量计算能力。

事件驱动:另一种扩大队列“响应时间”的方法是采用事件驱动的方法,队列中的人将交出表格,要求填写并返回完成。因此,接待员可以随时提出要求。这正是JavaScript自成立以来一直在做的事情。在浏览器中,JavaScript会响应用户点击事件,滚动,轻扫或数据库提取等。这在JavaScript中本质上是可能的,因为JavaScript将函数视为第一类对象,并且可以将它们作为参数传递给其他函数(称为回调函数),并且可以在完成特定任务时调用它们。这正是node.js在服务器上所做的。你可以找到更多关于事件驱动的编程和阻止I/O的信息,在节点的上下文中here