减少nodejs服务器上的CPU利用率

时间:2012-12-31 15:59:55

标签: javascript node.js web-applications linkedin express

我正在寻找降低CPU利用率的有趣方法 在NodeJS服务器上。

在我的研究期间,我发现了以下文章: http://engineering.linkedin.com/nodejs/blazing-fast-nodejs-10-performance-tips-linkedin-mobile

这些都是很棒的提示,但我有一个问题 提示#4。

这是否真的意味着用户正在请求“JavaScriptTemplate.html” 然后随后请求所有JSON(这里没有实现)?

假设所有动态内容都应该在没有用户的情况下可用 交互(例如,在按钮点击事件上请求JSON)是什么 实现这个的最好方法是什么?我可以考虑加载其他JS依赖项 (requirejs)执行函数以请求JSON的东西。

因为我从来没有看到大型网站调用静态html文件,但是 而是请求路由到他们的应用服务器多么常见 是上面的链接建议的解决方案?他们真的 使用服务器端模板浪费CPU利用率 主要是静态文本内容???

对于Node(expressJS),这必须是次优的方式 如果要生成的HTML相当复杂......理想情况下 Node应该只是作为提供JSON数据的API服务器运行。

你有什么想法可以分享吗?

2 个答案:

答案 0 :(得分:2)

这不是最常见的方法,但现在仍然很常见。有很多网页框架(谷歌angularjsknockoutmoustache等),可以在客户端使用这种模板理念。

向服务器(即json)请求模型并映射到静态视图(模板)。

我认为当你有一个提供JSON数据的API服务器时它非常适合。这样您就可以开发另一个API客户端,在这种情况下是一个Web客户端(RIA)。但我不认为这种方法背后的主要原因是节省CPU。

答案 1 :(得分:1)

感谢您分享帖子 - 这是一个很棒的帖子(对我而言非常及时)。

你实际上问了两个问题 - 1)如何在没有客户端交互的情况下加载数据来呈现html客户端; 2)当用户实际请求路由时如何将静态文件发送到浏览器。

无用户交互的渲染页面和客户端MVC上的¢2

1)您需要运行所有初始化/数据加载/呈现代码,以在页面加载后呈现页面。如果您在客户端使用jQuery(就像大多数Web应用程序那样):

$(document).ready(function(){
    // Your code here
});

它刚刚从jQuery docs复制。

大多数人使用骨干/下划线在客户端中构建MVC层。虽然有很多更好的(并且看似更强大的)客户端框架可以做到这一点,但这对夫妇可以为您提供足够的功率而不会限制您的选择或降低您在某些时候肯定需要的灵活性。除了许多非常有用的函数之外,Underscore(这是主干依赖)(如果花一个小时阅读整个单页手册,你会惊讶于JavaScript的可能性)有自己的模板,这些模板看似简单且同样时间非常强大,因为他们只是在模板中运行所有javascript。

虽然在模板中使用应用程序逻辑通常是一件坏事(尽管下划线允许,而且大多数有更高级的“更强大”的模板引擎都没有),但通常非常方便,并且能够添加一些模板中的逻辑,当你发现自己在一个紧张的角落(你经常会),而不是重新设计大量的应用程序逻辑或添加其他模板。

另外,我的意见是避免在编写here时使用require.js或任何其他模块加载器(直到你真的必须使用它们)。

为任何路由提供静态html,为node-as-api提供nginx配置

2)您需要重写对所有路由的请求以使用相同的静态html文件(或多个与路由相关的html文件)进行响应。根据您的偏好或应用程序要求,它可以是具有空体的文件(在这种情况下,用户将看到空白页,直到您的数据被加载并且页面被渲染/插入到正文中),一些欢迎页面甚至一些模板页面,其中而不是数据显示旋转轮。

重写请求的方式取决于用于提供静态内容和代理请求的Web服务器。如果你使用Apache(不太可能选择Node,因为它是同步的)你需要使用.htaccess文件。如果您使用Nginx作为大多数人使用节点do,您需要在配置文件中使用服务器块内的重写指令,就像在下面的示例中所做的那样:

server {
    listen       80;
    server_name  example.com;
    root         html/example;

    access_log   logs/example.log;

    # location block below sends specific static assets from inside your app's
    # public directory when routes /img, /js, /css, /views are requested
    location ~ /(img|js|css|views)/ {
        rewrite ^(.*)$ /public/$1 break;
    }

    # location block below proxies all data requests (/api route) to your node app
    location /api {
        proxy_pass             http://localhost:3000/;
        proxy_redirect         http://localhost:3000/ http://example.com;
        proxy_connect_timeout  30s;
        proxy_read_timeout     30s;
        proxy_cookie_domain    localhost example.com;
        #proxy_http_version     1.1;
    }

    # location block below rewrites all other routes to a specific html file
    # that is sent to the client and that is supposed to load all JS and
    # static assets to render a page
    location / {
        rewrite ^(.*)$ /public/app.html;
    }
}

在客户端呈现页面的方式(以及您从服务器请求的数据)将取决于用户请求的路由(您可以在javascript中访问/更改该路由以及您可以设置/访问/更改cookies)。应用程序内的所有导航(当用户单击任何按钮或内部链接时 - 您需要捕获所有单击事件)在没有对已加载的页面或静态资产的额外请求的情况下发生,仅将数据请求发送到服务器。

我希望它有所帮助。

SEO更新

nginx的建议配置仅适用于您不需要机器人索引的任何页面,并且对于需要您的静态htmls的其他网络应用程序可见,例如facebook,例如对于要编制索引的页面,需要添加条件以不同方式(基于$ http_user_agent)路由来自机器人的请求,并为这些路径呈现一些静态htmls。但它可以是一个不同的纯语义html(更小,没有设计图像,布局div /类,UI元素和javascript来减少爬行机器人和Web应用程序的请求)。