Node.js 与Rails/Passenger等设置相比,NodeJS处理请求的方式有什么不同?

Node.js 与Rails/Passenger等设置相比,NodeJS处理请求的方式有什么不同?,node.js,Node.js,我的理解是,节点是“事件”驱动的,而不是顺序驱动的服务器应用程序。我逐渐了解到这意味着,对于事件驱动软件,用户处于命令状态,他可以随时创建事件,服务器处于可以响应的状态,而对于顺序软件(如DOS提示符),应用程序会告诉用户何时“可以”响应,并且可能在任何给定时间都不可用(由于其他一些过程) 此外,我的理解是,像Node和EventMachine这样的应用程序使用某种反应器。它们等待“事件”发生,并使用回调将任务委托给其他工作者。好吧。那么,Rails&Passenger呢 当系统接收到“事件”时

我的理解是,节点是“事件”驱动的,而不是顺序驱动的服务器应用程序。我逐渐了解到这意味着,对于事件驱动软件,用户处于命令状态,他可以随时创建事件,服务器处于可以响应的状态,而对于顺序软件(如DOS提示符),应用程序会告诉用户何时“可以”响应,并且可能在任何给定时间都不可用(由于其他一些过程)

此外,我的理解是,像Node和EventMachine这样的应用程序使用某种反应器。它们等待“事件”发生,并使用回调将任务委托给其他工作者。好吧。那么,Rails&Passenger呢


当系统接收到“事件”时,Rails可能会使用NGINX之类的服务器与Passenger一起生成新的进程。这在概念上不是同一个想法吗?如果是,是否只是处理开销将两者真正分开,在节点已在等待处理时,Passenger可能需要生成新的Rails实例请求?

Node.js是事件驱动的非阻塞编程语言。关键是非阻塞部分。Node不会为其他进程生成。它在一个线程中运行(对于初学者来说……您现在可以通过一些模块生成它-我想-但这是另一个话题)

无论如何,这不同于其他典型的编程语言,在这种语言中,你收到一个请求,线程被锁定,直到它得到一个响应。如果你将它分配给另一个线程,该线程仍然被锁定

在节点中,您从不锁定。您接收请求,线程继续接收请求。处理请求时,将调用回调

希望我能让自己理解并使用正确的术语;)


无论如何,如果你想看这段视频,请看:

jribeiro描述的非阻塞/事件I/O就是答案的一部分。Ruby应用程序倾向于使用阻塞I/O编写,并使用进程和线程进行并发

然而,非阻塞和事件I/O不是节点固有的。通过使用EventMachine和进程内事件服务器(如Thin),您可以在Ruby中实现同样的功能。如果您直接针对EventMachine和Thin编程,那么它在架构上几乎与Node相同。也就是说,Ruby生态系统没有Node那么多事件友好的库和文档,所以在Ruby中实现同样的功能需要一些技巧

相反,Phusion Passenger管理流程的方式——即通过在流程之间生成多个流程和负载平衡请求,并监督流程——并非Ruby独有。事实上,Phusion Passenger最近引入了Node.js支持。Node.js支持