设为首页 收藏本站
查看: 882|回复: 0

[经验分享] 让nodejs 快如风的十个小技巧

[复制链接]

尚未签到

发表于 2017-2-22 07:35:19 | 显示全部楼层 |阅读模式
英文原文连接

 
1、避免使用同步的方法
 
nodejs 是基于单线程。为了让单线程能够处理高并发的请求,我们尽量要避免让线程等待,阻塞,同步,和长时间运行某项操作。nodejs 一个显著的特点就是彻头彻尾的异步。这个特性在基于事件驱动的应用上表现的非常的出色。
 
不幸的是在nodejs 中仍然存在可以同步或者阻塞调用方法。例如,许多的文件系统操作既有异步的方法也有同步的方法,像 fs.writeFile 和 fs.writeFileSync。尽管你避免在代码中使用同步的方法,但你引用的外部库中可能包含致使阻塞的方法调用。一旦这种情况出现,将会对性能产生显著的影响。
 

// 正确写法: 异步的写文件

fs.writeFile('message.txt', 'Hello Node', function (err) {

  console.log("It's saved and the server remains responsive!");

});


// 音响性能的写法: 同步的写文件

fs.writeFileSync('message.txt', 'Hello Node');


console.log("It's saved, but you just blocked ALL requests!");

2、关闭 socket 连接池

nodejs http client 自动使用socket 连接池,默认情况下每个主机将socket per 限制到五个。当socket 被回收重用后资源的增长将会无法控制,特别是你要处理从同一主机发送大量并发请求数据时候将会导致严重的性能瓶颈。这种情况下,最好的解决办法是增加 maxSockets 或者禁用 socket 连接池:
 


var http = require('http');


var options = {.....};


options.agent = false;


var req = http.request(options)

3、不要用nodejs 来管理静态资源
静态资源像css文化和图片文件,可以使用其他的web服务器来管理,比如 nginx ,或者你把你的文件上传到CDNs.
这样做有两个好处:(1)减少nodejs 的负载(2)CDNs可选择最近的服务器然投递静态内容减少了传输延迟。
4、渲染放到客户端
让我们快速比较下页面在服务端渲染和客户端渲染区别。如果我们用nodejs 渲染,每次请求我们返回的html如下:
<html>
  <head>

    <title>LinkedIn Mobile</title>

  </head>

  <body>

    <div class="header">

      <img src="http://mobile-cdn.linkedin.com/images/linkedin.png" alt="LinkedIn"/>

    </div>

    <div class="body">

      Hello John!
    </div>

  </body>

</html>



显然的除了用户的名字是动态,其他都是静态。也就是说相同东西每次都要加载一遍。更有效的方法就是直接让

nodejs 返回动态的json数据:

{"name": "John"}

剩下的静态标签可以使用javascript 模版引擎


<html>
  <head>

    <title>LinkedIn Mobile</title>

  </head>

  <body>

    <div class="header">

      <img src="http://mobile-cdn.linkedin.com/images/linkedin.png" alt="LinkedIn"/>

    </div>

    <div class="body">

      Hello <%= name %>!
    </div>

  </body>

</html>



静态javascript 模版可以用nginx 代理,其实如果放到CDN就更好了。

另外你可以在模版第一次时保存到浏览器缓存中或者存放到 本地存储中。之后页面初始化完毕,

就剩下动态的json数据 的交互。大大减小了cpu 时间和io 负载。




5、开启gzip

越来越多的web服务器和客户端支持gzip 压缩。

这个好处真的不要放过哦,不管是响应客户端或者请求服务都可以采用。

6、使用并行

试着把请求远程服务,数据库调用,文件系统访问这些操作并行起来运行。如果按照线性的步骤来运行这些费时

的操作延迟总量等于每个操作延时总和。推荐使用Step 来管理你的callback 流程。


7、尽量不要使用session

Express framework  管理request/response 的生命周期,许多 express 的例子包含下面的配置:

app.use(express.session({ secret: "keyboard cat" }));



默认情况下,seesion 是存储在内存中的,这个会增加服务器的额外开销,特别用户量增加时候。

你可以把session 存储到数据库,例如MongoDB 或者Redis ,

但是每个请求的都会从数据库查询session 信息这样也增加了额外的性能开销。

如果可以,最好的选择不要在服务端存储状态信息。express 中没这样的配置,但是性能提升是显然。

8、使用二进制模块

如果可以,使二进制模块来取代javascript 的模块,

例如当我们从用javascript 写SHA 的模块切换到编译成二进制模块时,我们发现很大性能提升空间。


// 使用本地内置的二进制模块

var crypto = require('crypto');


var hash = crypto.createHmac("sha1",key).update(signatureBase).digest("base64");




9、使用标准v8 javascript 而不是客户端库

许多的javacript 库专门用于web浏览器,

这些浏览器的javascript 引擎不一致:有些浏览器支持某些方法像 forEach,map 和reduce,

但是其他的浏览器没有这些方法。

结果导致,客户端库含有许多有损性能的代码来保证方法的兼容。

话说回来,你要准确的知道nodejs 哪些方法是可以用的:nodejs 使用v8 引擎 ,v8 实现了 ECMA-262, 5th edition. 直接使用v8标准函数将会获得大的性能提升。





10、 保持代码简洁




保持的你的代码的清洁不管是客户端或者服务端。不断的审视自己:"我们真需要这个模块吗?","为什么需要这个框架","性能的消耗值得吗?","是否有更简单的方法?"。简洁的代码往往更加的高效。






运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-345385-1-1.html 上篇帖子: 基于NODEJS的前后端项目分离实践 下篇帖子: 一起读nodejs(四)----插件(addons)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表