NodeJS,我对“高、高、非”的一些看法
·众所周知
NodeJS三大神器"事件驱动,V8,回调函数"。
·事件驱动,故名思议:等快递和收快递区别。NodeJS将原先大牛们掌握的神神秘秘的EPOLL走向大众化,这点是最大的贡献。当然事件驱动最早最有发言权的还是FLASH拥护者,在那个学校只教授顺序编程的年代里,一些广为流传的FLASH作品都源自事件驱动。
·V8:初闻该名比较深奥。网上有不少介绍不再累述,个人理解快在JIT和HASH定位对象上,跳过了CLASS代码。
·事件回调:这些年比较流行的风格,熟悉之后如沐清风,不熟悉的时候死活想不明白。
仅接着,围绕着三项,无论是官方还是民间立即给NodeJS贴上了高性能、高并发、非阻塞I/O的标签。一篇繁荣景象的面前,要想真正将此落地,仍然有许多功课需要完成。
·最大的硬伤"单线程"
NodeJS有句话就"除了代码,所有一切都是并行执行的"。这句话乍一看不是很明白,下面这个例子之后,
req.on('end',function(){
console.log(j+":"+body);
// sleep(11); //BLOCK
/* //FORK
exec("systeminfo",function(err,stdot,stderr){
res.end("aa"+'\n');
});
*/
j++;
res.write("ccc"+"\n");
});
就会发现如果出现了要想完成SLEEP这件事,光靠Node本身一个进程一个线程根本不可能实现。但在其他高级语言C/JAVA中,SLEEP并不是一件什么大事,多起一个Thread就解决了。Node要想实现,只可能再Fork一个进程来分担老爹进程的活。所以,市面上所谓的Node多线程模块都是一种曲线救国,实际上是多进程,包括以后能不能火起来的H5-WebWorker。所以,批注中的取systeminfo,这个比较耗时的动作也只能依靠Fork来绕开,已达到表面上的高并发高性能。
那是不是通过神器"事件回调就能绕开"了呢?答案也是否定的,即便是在单线程模式下最接近异步调用的eventproxy也无法彻底解决这一难题。如下代码,但这不妨碍eventproxy成为一件大众佳作。
function sleep(milliSeconds) {
var startTime = new Date().getTime();
while (new Date().getTime() < startTime + milliSeconds);
}
function test300(obj){
sleep(2000);
obj.trigger("v3",300);
}
var EventProxy = require("eventproxy").EventProxy;
var obj = new EventProxy();
var counter = 0;
var add= function (v1, v2, v3){
console.log(v1+v2+v3+'');
};
obj.assign("v1", "v2", "v3", add);
obj.trigger("v1",100);
test300(obj);
obj.trigger("v2",200);
console.log("I'm Done");
很多时候,有人甚至把NodeJS这一特性作为卖点,个人绝对这个卖点用不好就会啃人,如果真要说卖点,倒是可以往业务逻辑可读性上去扯开。但是事件回调又给代码可读性脱了不少后退。所以,现在想想老外的那句话真是一语中的,绝对算是非常负责的一句话。
·如果要做到"高、高、非"有办法吗?
老实说,就官网API来说难度真是不小,很多的例子太过理想化了。所以多少是要借助其他高级语言的辅助,其中取巧的方法就是EPOLL+多线程,当然这前提得要有足够时间思考,因为这个水非常深,并且要步步为营。在没有强大的技术基础上,还是推荐下面一些技巧,希望对大家有所借鉴。
- 首先,充分评估要实现的功能,如果业务量少的阻塞,可以借fork的力(child_process模块)。
- 当你是一个服务端,如果有点良心的话,把settimeout留好,别外面人给拖死。写代码的都不容易。
- 当你是一个客户端,记得保护好自己,要设超时,NodeJS的http没有现成的timeout事件和模块,这个得要重写socket和streaming模块,很麻烦。
- 针对短连接,调优操作系统TIME_WAIT参数的CD时间。并且弃用Fork,想尽办法优化自身业务逻辑。
·万事不离"能量守恒定律"
没有绝对的高性能服务器,就像世界上没有永动机一样,开门关窗、开窗关门。C/JAVA的Thread是以牺牲CPU为交换代价,Node的事件已自我承担单线程风险为代价。把复杂的运算成本留给谁,这是值得认真思考的一件事情。
NodeJS,我对“高、高、非”的一些看法的更多相关文章
- 《C程序设计语言》(K&R)中文高清非扫描件
<C程序设计语言>(K&R)中文高清非扫描件(带书签目录) 对于某下载东西都要C币的网站无爱了.好不容易找了一个,发出来看会不会帮到别人 附上addr:https://pan. ...
- NodeJS系列~第三个小例子,NodeJs与Redis实现高并发的队列存储
返回目录 众所周知 redis量个强大的缓存组件,可以部署在win32和linux环境之上,它有五大存储结构,其中有一种为列表list,它可以实现quene和stack的功能,即队列和堆栈的功能. r ...
- 高通非adsp 架构下的sensor的bug调试
高通 sensor 从native到HAL 高通HAL层之Sensor HAL 高通HAL层之bmp18x.cpp 问题现象: 当休眠后,再次打开preesure sensor的时候,会出现隔一段时候 ...
- nodejs 从helloworld到高质量的后台服务server的一点思考
---恢复内容开始--- 新公司用的nodejs作为app和网站的后台服务server,所以最近对nodejs一直在学习,加上之前简单的学习了一点,看了两天后台接口源码,所以就直接上手干活了,下面是我 ...
- [高清·非影印]Spring实战+SpringBoot实战+Spring微服务实战+SpringCloud微服务实战(全4本)
------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...
- [高清·非影印] Docker 容器与容器云(第2版)
------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...
- [高清·非影印] Python机器学习经典实例(电子书+源码)
------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...
- [高清·非影印] 深度学习入门:基于Python的理论与实现 + 源代码
------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...
- nodejs直接调用grunt(非调用批处理)
在windows下,我们做js构建工作,都习惯安装grunt-cli,只需要命令行grunt...一切构建工作都自动完成了.这已经是很完美的情况了,不过最近要做一个服务器版的自动化构建系统,在node ...
随机推荐
- mysql 删除重复数据sql声明
CREATE TABLE tmp AS SELECT id FROM get_review_url WHERE (no,title,name,content) IN (SELECT no,title, ...
- RH133读书 笔记(4) - Lab 4 System Services
Lab 4 System Services Goal: Develop skills using system administration tools and setting up and admi ...
- 数据库 版本号是 661,打不开。此server支持 655 和更早的版本号。不支持降级路径
"数据库 的版本号为 661,无法打开.此server支持 655 版及更低版本号. 不支持降级路径" 出现这种问题,通常是由于数据库版本号不同造成的. 我们能够用以下的语句查询数 ...
- 跳转表C语言,不比redis版本号
本来跳表的原理很easy的(相对于红 - 黑树),但国庆间歇性地搞5天才捞起来-- 我学会了跳之前写表的链式结构完全基于,我看着写的过程中redis实现,它的每个键列都是用数组来表示的.细致想了想发现 ...
- Java操作memcached(一)
Memcached事实上,两次Hash算法 第一次hash算法被用于定位Memcached示例 第二次hash算法是底部HashMap中间hash算法 Hash算法 1.依据余数 ...
- 【从零学习openCV】IOS7根据人脸检测
前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app.总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...
- Visual Studio Team Services使用教程--添加团队成员
- 阿里巴巴2014研发project师实习生面试经历
java研发project师的初面是在上周三进行的,终于结果到了晚上才出,而没有通过的则是一结束网上就更新了状态.之后阿里通知这周三,也就是今天进行二面. 凑巧的是今早被舍友吵醒,中午那个困啊,但没时 ...
- hdu 4965 Fast Matrix Calculation(矩阵高速幂)
题目链接.hdu 4965 Fast Matrix Calculation 题目大意:给定两个矩阵A,B,分别为N*K和K*N. 矩阵C = A*B 矩阵M=CN∗N 将矩阵M中的全部元素取模6,得到 ...
- NSIS:制作软件升级安装包
原文 NSIS:制作软件升级安装包 相信不是每个人写的软件都只发布一次就可以了,肯定要有修改和维护的情况发生.在这种情况下,您可能就需要一个软件的升级安装包了. 现在,我们就来一步步把这个安装包做 ...