我刚开始在 node.js 中编码一段时间。现在这是我的一个问题:
在 HTTP 应用程序中,给定请求-响应模型,单个应用程序线程被阻塞,直到所有后端任务完成并将响应返回给客户端,因此性能改进似乎仅限于微调后端之类的东西并行化 IO 请求。(好吧,当涉及到许多繁重且独立的 IO 操作时,这种改进很重要,但通常情况还意味着,通过重新设计数据结构,您可以消除大量 IO 请求,并且可能最终获得更好的性能而不仅仅是发出并行操作。)
如果这是真的,它怎么能产生比那些基于 Java(或 PHP、python 等)的框架更好的性能呢?
我还参考了一篇文章Understanding the node.js event loop,也说明了这种情况:
它确实是一个单线程运行:你不能做任何并行代码执行;例如,做一个“睡眠”会阻塞服务器一秒钟:
while(new Date().getTime() < now + 1000) {
// do nothing
}
…然而,除了你的代码之外,一切都是并行运行的。
我个人通过将确切的“睡眠”代码放入一个 IO 回调闭包中验证了这一点,并尝试提交导致此回调的请求,然后提交另一个。这两个请求在处理时都会触发控制台日志。我的观察是后者被阻止,直到前者返回响应。
那么,这是否意味着只有在双方都可以随时发出事件和相互推送消息的套接字模式下,才能发挥其异步处理能力的全部威力呢?
我对此有点困惑。欢迎任何意见或建议。谢谢!
更新
我问这个问题是因为报告了一些性能评估案例,例如Node.js 正在接管企业——不管你喜欢与否,LinkedIn 从 Rails 迁移到 Node:27 台服务器削减和高达 20 倍的速度。一些激进的观点声称 J2EE 将被完全取代:J2EE 已死:由 JSON 服务支持的长寿 Javascript。