3 回答
TA贡献2011条经验 获得超2个赞
Node.js是作为异步处理中的实验而显式创建的。从理论上讲,与典型的基于线程的实现相比,在典型的Web负载下对单个线程执行异步处理可以提供更高的性能和可伸缩性。
你知道吗?我认为理论已经被证实。与Apache或IIS或其他基于线程的服务器相比,不占用大量CPU资源的node.js应用程序可以运行数千个并发连接。
单线程异步性质的确使事情变得复杂。但是,老实说,您认为它比线程处理还要复杂吗?一种种族状况可能会破坏您的整个月!或由于某处的某些设置而清空线程池,并观察响应时间变慢以进行爬网!更不用说死锁,优先级反转以及与多线程相关的所有其他回旋。
最后,我不认为它普遍好坏。这是不同的,有时更好,有时则不是。使用正确的工具完成工作。
TA贡献1772条经验 获得超8个赞
服务器的“每个请求一个线程”模型的问题在于,与事件循环线程模型相比,它们在几种情况下无法很好地扩展。
通常,在I / O密集型方案中,请求花费大部分时间等待I / O完成。在此期间,在“每个请求一个线程”模型中,链接到该线程的资源(例如内存)未使用,内存是限制因素。在事件循环模型中,循环线程选择要处理的下一个事件(I / O完成)。因此,线程总是很忙(如果正确编程的话)。
事件循环模型看起来很新鲜,所有问题的解决方案都取决于您需要解决的情况,但是要使用哪种模型。如果您具有密集型I / O方案(如代理),则将以事件基模型为准,而并行进程数量较少的CPU密集型方案将最适合基于线程的模型。
在现实世界中,大多数情况都将处于中间位置。您将需要在可伸缩性的实际需求与开发复杂性之间找到平衡,以找到正确的体系结构(例如,具有事件基前端,该事件基前端可以委托后端执行CPU密集型任务。前端将使用很少的资源来等待任务与任何分布式系统一样,它需要付出一些努力才能使其正常工作。
如果您不费吹灰之力地寻找适合任何情况的银色子弹,那么最终您将获得一枚子弹。
- 3 回答
- 0 关注
- 937 浏览
添加回答
举报