Node.js Express服务器:使用Node.js threadpool

时间:2015-10-08 22:12:41

标签: node.js express server-side ejs

我们有一个使用EJS模板将服务器端渲染用于SEO目的的应用程序。

我非常熟悉Node.js,并且知道可能无论出于何种目的,都可以利用Node.js线程池进行异步I / O,无论是好主意还是坏主意。目前我想知道是否可以在线程池中使用线程而不是Node.js中的主线程运行ejs.render()或res.render()?

我们在渲染函数中做了很多繁重的计算工作,我们肯定希望在主线程之外,否则我们将为更多服务器支付$$$。

3 个答案:

答案 0 :(得分:1)

这只是与你有关的渲染吗?还有其他模板引擎可以产生更好的结果;由于模板渲染应该是幂等操作,您还可以在集群中进行分发。

V8会将您的代码编译为程序集,如果您没有进行任何去优化或被垃圾收集器停顿,我相信您应该在您的网络I / O限制附近。我肯定会建议你尝试其他模板引擎,在前面添加一个缓存HTTP反向代理并首先运行一些基准测试。

答案 1 :(得分:1)

众所周知,EJS是同步的,并且不会改变,因此它基本上是Node.js的低效渲染引擎,因为它会在呈现视图时阻止JS线程,这会降低您的整体吞吐量,特别是如果您的渲染是CPU重。

你一定要考虑其他一些选择。例如。 https://github.com/ericf/express-handlebars

如果你的网络服务器确实有大量的CPU计算,那么Node.js绝对不是正确的工具。有更好的服务器来处理多线程和并行处理。您可以将Node设置为控制器,并将占用大量CPU的请求转发给可以完成繁重任务的后端服务/服务器。

在渲染过程中查看您正在进行的计算以提供更好的答案会很有帮助。

攻入线程池(由libuv处理)可能是一个坏主意,但当然可能......你只需要一些C ++技能和uv_queue_work()方法libuv库,用于在工作线程上安排内容。

答案 2 :(得分:1)

我已经尝试构建一个在分叉进程中运行的脚本引擎(Read on node的子进程模块here)。我发现这对于实现渲染引擎来说是一个很有吸引力的命题。是的,有传递参数的问题(发布/获取查询字符串,会话状态等),但它们很容易处理,特别是如果你使用fork选项(而不是exec或spawn)。有标准的消息传递方法在子节点和父节点之间进行通信。

唯一的开销是生成节点的附加实例(渲染引擎本身)。如果您在脚本引擎中进行大量计算,那么这个常量,与渲染时间相比,分配新进程的每次渲染请求开销一次性很小。

如果EJS渲染阻塞了主节点线程,那么仅在渲染过程中进行任何重要计算时,单独使用它就不足以使用它。