在技术层面上,和Erlang/OTP 相比之下 英文,Node.js有什么优势

14:44 提问
node.js到底怎么样,它的劣势在哪里呢
现在node.js挺火的,但是node.js到底如何啊?和现在的PHP、JSP在后台上、在于前端的交互上相比怎么样?node.js的劣势在哪里呢
按赞数排序
首先跟你说说nodejs的优势。
1.如果你是一个对javascript非常熟悉的人,那么使用nodejs就会非常容易上手。
2.使用javascript一门语言就可以搞定前端后端,不用在几门语言中切来切去。
3.nodejs非常方便部署,本身已经带了v8引擎,直接运行命令就可以实现部署,无须依赖tomcat等大型的服务器,无须做复杂的配置。
4.nodejs基于事件驱动,异步回调机制,适合大并发量的请求。
5.nodejs社区非常活跃,有很多成熟的套件可以使用,而且还在持续更新。
当然,优点还有很多,这里简单列举几条。下面说说个人认为它的不好的地方。
1.调试比较困难,由于是类javascript语言,且是解释性语言,只有运行时才知道是否正确,如果是非语法错误是不会有错误提示的,定位错误不太容易。
2.异步回调机制可能会出现回调函数多层嵌套,代码优雅性不佳。
3.nodejs由于不支持多线程,不适合进行大数据分析和计算类型的项目。
总之,nodejs是一门新的语言,而且非常引人注意,需要根据项目需求和人力情况综合考虑。
这种讨论没有任何意义。node.js就是将js这种语言代入web后端开发而已,而不同的编程语言都有它的拥趸。既然有人喜欢js,那么必然出现一种用它实现的服务器端框架。仅此而已。
要说到优势和劣势,那么如果你精通一种语言,使用这种语言就能搞定需要的开发任务,而不是另外学一种语言,这就是最大的优势。好比火车上卖方便面,方便面本来没有优势,但是你坐火车这个前提的情况下,你中途下车就为了享受一顿午餐,而再换下一班火车继续履行显然就是不明智的决定。
要说劣势,如果你不擅长这种编程语言,不要被某个框架的一点特性迷惑,你要先学习这种语言,然后才能用这个框架,这个明显的学习成本就是最大的劣势。何况js是一种充满了坑的语言。
NodeJs:采用异步单线程机制,适合于I/O密集的场景,I/O性能非常高,不适合计算密集的场景,且典型案例和规模应用案例比较少
PHP:是老牌的开发语言,也是采用异步单线程,适合各种WEB应用场景,优点是资料齐备,框架齐全,执行速度快,BUG少;缺点是容易产生代码耦合的情况.
JSP:社区活跃,开发者群体广大,典型案例和规模应用案例较多,缺点是性能低下,系统复杂度高
node.js在高密集的I/O方面很适合,而且对于熟悉js的前端开发人员来说很适合入门
其他相关推荐登录以解锁更多InfoQ新功能
获取更新并接收通知
给您喜爱的内容点赞
关注您喜爱的编辑与同行
966,690 十一月 独立访问用户
语言 & 开发
架构 & 设计
文化 & 方法
您目前处于:
深入浅出Node.js(一):什么是Node.js
深入浅出Node.js(一):什么是Node.js
0&他的粉丝
日. 估计阅读时间:
:开启与Netflix、微软、ThoughtWorks等公司的技术创新之路!
亲爱的读者:我们最近添加了一些个人消息定制功能,您只需选择感兴趣的技术主题,即可获取重要资讯的。
相关厂商内容
相关赞助商
看到Node.js这个名字,初学者可能会误以为这是一个Javascript应用,事实上,Node.js采用C++语言编写而成,是一个Javascript的运行环境。为什么采用C++语言呢?据Node.js创始人Ryan Dahl回忆,他最初希望采用Ruby来写Node.js,但是后来发现Ruby虚拟机的性能不能满足他的要求,后来他尝试采用V8引擎,所以选择了C++语言。既然不是Javascript应用,为何叫.js呢?因为Node.js是一个Javascript的运行环境。提到Javascript,大家首先想到的是日常使用的浏览器,现代浏览器包含了各种组件,包括渲染引擎、Javascript引擎等,其中Javascript引擎负责解释执行网页中的Javascript代码。作为Web前端最重要的语言之一,Javascript一直是前端工程师的专利。不过,Node.js是一个后端的Javascript运行环境(支持的系统包括*nux、Windows),这意味着你可以编写系统级或者服务器端的Javascript代码,交给Node.js来解释执行,简单的命令类似于:
#node helloworld.js
Node.js采用了Google Chrome浏览器的V8引擎,性能很好,同时还提供了很多系统级的API,如文件操作、网络编程等。浏览器端的Javascript代码在运行时会受到各种安全性的限制,对客户系统的操作有限。相比之下,Node.js则是一个全面的后台运行时,为Javascript提供了其他语言能够实现的许多功能。
Node.js采用事件驱动、异步编程,为网络服务而设计
事件驱动这个词并不陌生,在某些传统语言的网络编程中,我们会用到回调函数,比如当socket资源达到某种状态时,注册的回调函数就会执行。Node.js的设计思想中以事件驱动为核心,它提供的绝大多数API都是基于事件的、异步的风格。以Net模块为例,其中的net.Socket对象就有以下事件:connect、data、end、timeout、drain、error、close等,使用Node.js的开发人员需要根据自己的业务逻辑注册相应的回调函数。这些回调函数都是异步执行的,这意味着虽然在代码结构中,这些函数看似是依次注册的,但是它们并不依赖于自身出现的顺序,而是等待相应的事件触发。事件驱动、异步编程的设计(感兴趣的读者可以查阅笔者的另一篇文章《》),重要的优势在于,充分利用了系统资源,执行代码无须阻塞等待某种操作完成,有限的资源可以用于其他的任务。此类设计非常适合于后端的网络服务编程,Node.js的目标也在于此。在服务器开发中,并发的请求处理是个大问题,阻塞式的函数会导致资源浪费和时间延迟。通过事件注册、异步函数,开发人员可以提高资源的利用率,性能也会改善。
从Node.js提供的支持模块中,我们可以看到包括文件操作在内的许多函数都是异步执行的,这和传统语言存在区别,而且为了方便服务器开发,Node.js的网络模块特别多,包括HTTP、DNS、NET、UDP、HTTPS、TLS等,开发人员可以在此基础上快速构建Web服务器。以简单的helloworld.js为例:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(80, &127.0.0.1&);
上面的代码搭建了一个简单的http服务器(运行示例部署在中,读者可以访问),在本地监听80端口,对于任意的http请求,服务器都返回一个头部状态码为200、Content-Type'值为text/plain'的&Hello World&文字响应。从这个小例子中,我们可以看出几点:
Node.js的网络编程比较便利,提供的模块(在这里是http)开放了容易上手的API接口,短短几行代码就可以构建服务器。
体现了事件驱动、异步编程,在createServer函数的参数中指定了一个回调函数(采用Javascript的匿名函数实现),当有http请求发送过来时,Node.js就会调用该回调函数来处理请求并响应。当然,这个例子相对简单,没有太多的事件注册,在以后的文章中读者会看到更多的实际例子。
Node.js的特点
下面我们来说说Node.js的特点。事件驱动、异步编程的特点刚才已经详细说过了,这里不再重复。
Node.js的性能不错。按照创始人Ryan Dahl的说法,性能是Node.js考虑的重要因素,选择C++和V8而不是Ruby或者其他的虚拟机也是基于性能的目的。Node.js在设计上也是比较大胆,它以单进程、单线程模式运行(很吃惊,对吧?这和Javascript的运行方式一致),事件驱动机制是Node.js通过内部单线程高效率地维护事件循环队列来实现的,没有多线程的资源占用和上下文切换,这意味着面对大规模的http请求,Node.js凭借事件驱动搞定一切,习惯了传统语言的网络服务开发人员可能对多线程并发和协作非常熟悉,但是面对Node.js,我们需要接受和理解它的特点。由此我们是否可以推测出这样的设计会导致负载的压力集中在CPU(事件循环处理?)而不是内存(还记得Java虚拟机抛出OutOfMemory异常的日子吗?),眼见为实,不如来看看淘宝共享数据平台团队对Node.js的:
物理机配置:RHEL 5.2、CPU 2.2GHz、内存4G
Node.js应用场景:MemCache代理,每次取100字节数据
连接池大小:50
并发用户数:100
测试结果(socket模式):内存(30M)、QPS(16700)、CPU(95%)
从上面的结果,我们可以看到在这样的测试场景下,qps能够达到16700次,内存仅占用30M(其中V8堆占用22M),CPU则达到95%,可能成为瓶颈。此外,还有不少实践者对Node.js做了性能分析,总的来说,它的性能让人信服,也是受欢迎的重要原因。既然Node.js采用单进程、单线程模式,那么在如今多核硬件流行的环境中,单核性能出色的Node.js如何利用多核CPU呢?创始人Ryan Dahl建议,运行多个Node.js进程,利用某些通信机制来协调各项任务。目前,已经有不少第三方的Node.js多进程支持模块发布,专栏后面的文章会详细讲述Node.js在多核CPU下的编程。
Node.js的另一个特点是它支持的编程语言是Javascript。关于动态语言和静态语言的优缺点比较在这里不再展开讨论。只说三点:
var hostRequest = http.request(requestOptions,function(response) {
var responseHTML ='';
response.on('data', function (chunk) {
responseHTML = responseHTML +
response.on('end',function(){
console.log(responseHTML);
// do something useful
在上面的代码中,我们需要在end事件中处理responseHTML变量,由于Javascript的闭包特性,我们可以在两个回调函数之外定义responseHTML变量,然后在data事件对应的回调函数中不断修改其值,并最终在end事件中访问处理。
Javascript作为前端工程师的主力语言,在技术社区中有相当的号召力。而且,随着Web技术的不断发展,特别是前端的重要性增加,不少前端工程师开始试水&后台应用&,在许多采用Node.js的企业中,工程师都表示因为习惯了Javascript,所以选择Node.js。
Javascript的匿名函数和闭包特性非常适合事件驱动、异步编程,从helloworld例子中我们可以看到回调函数采用了匿名函数的形式来实现,很方便。闭包的作用则更大,看下面的代码示例:
Javascript在动态语言中性能较好,有开发人员对Javacript、Python、Ruby等动态语言做了性能分析,发现Javascript的性能要好于其他语言,再加上V8引擎也是同类的佼佼者,所以Node.js的性能也受益其中。
Node.js发展简史
2009年2月,Ryan Dahl在博客上宣布准备基于V8创建一个轻量级的Web服务器并提供一套库。
2009年5月,Ryan Dahl在GitHub上发布了最初版本的部分Node.js包,随后几个月里,有人开始使用Node.js开发应用。
2009年11月和2010年4月,两届JSConf大会都安排了Node.js的讲座。
2010年年底,Node.js获得云计算服务商Joyent资助,创始人Ryan Dahl加入Joyent全职负责Node.js的发展。
2011年7月,Node.js在微软的支持下发布Windows版本。
Node.js应用案例
虽然Node.js诞生刚刚两年多,但是其发展势头逐渐赶超Ruby/Rails,我们在这里列举了部分企业应用Node.js的案例,听听来自客户的声音。
在社交网站LinkedIn最新发布的移动应用中,NodeJS是该移动应用的后台基础。LinkedIn移动开发主管Kiran Prasad对媒体,其整个移动软件平台都由NodeJS构建而成:
LinkedIn内部使用了大量的技术,但是在移动服务器这一块,我们完全基于Node。
(使用它的原因)第一,是因为其灵活性。第二,如果你了解Node,就会发现它最擅长的事情是与其他服务通信。移动应用必须与我们的平台API和数据库交互。我们没有做太多数据分析。相比之前采用的Ruby on Rails技术,开发团队发现Node在性能方面提高很多。他们在每台物理机上跑了15个虚拟服务器(15个实例),其中4个实例即可处理双倍流量。容量评估基于负载测试的结果。
企业社会化服务网站Yammer则利用Node创建了针对其自身平台的跨域代理服务器,第三方的开发人员可以通过该服务器实现从自身域托管的Javascript代码与Yammer平台API的AJAX通信。Yammer平台技术主管Jim Patterson对Node的优点和缺点提出了自己的:
(优点)因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求,因此构建在Node上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好得多。此外,与Node代理服务器交互的客户端代码是由javascript语言编写的,因此客户端和服务器端都用同一种语言编写,这是非常美妙的事情。
(缺点)Node是一个相对新的开源项目,所以不太稳定,它总是一直在变,而且缺少足够多的第三方库支持。看起来,就像是Ruby/Rails当年的样子。
知名项目托管网站GitHub也尝试了Node应用。该Node应用称为NodeLoad,是一个存档下载服务器(每当你下载某个存储分支的tarball或者zip文件时就会用到它)。GitHub之前的存档下载服务器采用Ruby编写。在旧系统中,下载存档的请求会创建一个Resque任务。该任务实际上在存档服务器上运行一个git archive命令,从某个文件服务器中取出数据。然后,初始的请求分配给你一个小型Ruby Sinatra应用等待该任务。它其实只是在检查memcache flag是否存在,然后再重定向到最终的下载地址上。旧系统运行大约3个Sinatra实例和3个Resque worker。GitHub的开发人员觉得这是Node应用的好机会。Node基于事件驱动,相比Ruby的阻塞模型,Node能够更好地处理git存档。在编写新下载服务器过程中,开发人员觉得Node非常适合该功能,此外,他们还里利用了Node库socket.io来监控下载状态。
不仅在国外,Node的优点也同样吸引了国内开发人员的注意,就实际应用了Node技术:
MyFOX 是一个数据处理中间件,负责从一个MySQL集群中提取数据、计算并输出统计结果。用户提交一段SQL语句,MyFOX根据该SQL命令的语义,生成各个数据库分片所需要执行的查询语句,并发送至各个分片,再将结果进行汇总和计算。 MyFOX的特点是CPU密集,无文件IO,并只处理只读数据。起初MyFOX使用PHP编写,但遇到许多问题。例如PHP是单线程的,MySQL又需要阻塞查询,因此很难并发请求数据,后来的解决方案是使用nginx和dirzzle,并基于HTTP协议实现接口,并通过curl_multi_get命 令进行请求。不过MyFOX项目组最终还是决定使用Node.js来实现MyFOX。
选择Node.js有许多方面的原因,比如考虑了兴趣及社区发展,同时也希望可以提高并发能力,榨干CPU。例如,频繁地打开和关闭连接会让大量端口处于等待状态,当并发数量上去之后,时常会因为端口不够用(处于TIME_WAIT状态)而导致连接失败。之前往往是通过修改系统设置来减少等待时间以绕开这个错误,然而使用连接池便可以很好地解决这个问题。此外,以前MyFOX会在某些缓存失效的情况下出现十分密集的访问压力,使用 Node.js便可以共享查询状态,让某些请求&等待片刻&,以便系统重新填充缓存内容。
本文简要介绍了Node.js的基本知识,包括概念、特点、历史、案例等等。作为一个仅仅2岁的平台,Node.js的发展势头有目共睹,越来越多的企业开始关注并尝试Node.js,前后端开发人员应该了解相关的内容。
作者的微信公众号&老崔瞎编&,关注IT趋势,承载前沿、深入、有温度的内容。感兴趣的读者可以搜索ID:laocuixiabian,或者扫描下方二维码加关注。
【编者按】:本专栏欢迎有志于宣传和推广Node.js的布道师、开发人员和技术专家投稿,有意者请通过邮件与本专栏主持人崔康(cuikang[)联系。
感谢对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至。也欢迎大家加入到中与我们的编辑和其他读者朋友交流。
Author Contacted
语言 & 开发
119 他的粉丝
深入浅出Node.js
11 他的粉丝
1 他的粉丝
2 他的粉丝
JavaScript
37 他的粉丝
0 他的粉丝
告诉我们您的想法
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
Re: 作者要注意一下语法错误啊
说法欠妥...
Re: 作者要注意一下语法错误啊
期待后续内容
我觉得你一点也没说到点子上
为什么要用Node.js,和java比较有什么优势和劣势?
对node.js一无所知的人
看了也不明白
Re: 看了也不明白
我知道他的优点
我的node.js学习心得
CPU 占用95%,能说明性能好?
gitHub帐号做个任务,30元,支付宝交易,谢谢帮忙
Re: CPU 占用95%,能说明性能好?
Re: gitHub帐号做个任务,30元,支付宝交易,谢谢帮忙
Re: 为什么要用Node.js,和java比较有什么优势和劣势?
汇总了一些node.js的免费课程,希望对大家有帮助。
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
赞助商链接
InfoQ每周精要
订阅InfoQ每周精要,加入拥有25万多名资深开发者的庞大技术社区。
架构 & 设计
文化 & 方法
<及所有内容,版权所有 &#169;
C4Media Inc.
服务器由 提供, 我们最信赖的ISP伙伴。
北京创新网媒广告有限公司
京ICP备号-7
找回密码....
InfoQ账号使用的E-mail
关注你最喜爱的话题和作者
快速浏览网站内你所感兴趣话题的精选内容。
内容自由定制
选择想要阅读的主题和喜爱的作者定制自己的新闻源。
设置通知机制以获取内容更新对您而言是否重要
注意:如果要修改您的邮箱,我们将会发送确认邮件到您原来的邮箱。
使用现有的公司名称
修改公司名称为:
公司性质:
使用现有的公司性质
修改公司性质为:
使用现有的公司规模
修改公司规模为:
使用现在的国家
使用现在的省份
Subscribe to our newsletter?
Subscribe to our industry email notices?
我们发现您在使用ad blocker。
我们理解您使用ad blocker的初衷,但为了保证InfoQ能够继续以免费方式为您服务,我们需要您的支持。InfoQ绝不会在未经您许可的情况下将您的数据提供给第三方。我们仅将其用于向读者发送相关广告内容。请您将InfoQ添加至白名单,感谢您的理解与支持。问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
为什么现在nodeJs只适合做中间层,Java的地位撼动不了
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
nodeJs 高并发 ,更加灵活,java更加稳定!~~
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
java强在计算。
node强在IO,并且同是js堆栈,对前端比较友好,而恰好在应用复杂后,前端需要来处理controller了,而Java做好接口服务的职责就好。
另一方面,node作为中间层,以异步的特性,也可以一定程度降低异构系统的差异化成本吧。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
针对楼主的问题来回答。
1、为什么nodejs为什么只适合做中间层?
不妨换个思维,nodejs去做业务层、数据层会怎样?我用纯nodejs做过应用,发现业务逻辑层太难写了,由于nodejs天生的语言缺陷,复杂的逻辑在碰到一堆callback的时候代码简直没法看,即使用了promise之类的库,也没法完全弥补这个缺陷。大型的网站架构非常注重可维护性,代码可读性低,可维护性自然低了。
2、为什么撼动不了java的地位?
两者的定位本来就不同,为什么要取代呢?两个语言存在不一定要是你死我活的,大型it项目往往是多语言结合的,取长补短,复杂的业务逻辑用java来做,用nodejs处理一些路由映射和参数校验,前端工程师也能部分参与后台工程师的工作,这样项目可扩展性其实更好。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
node或者说js的特性(单线程,异步,弱类型)决定了它比较适合快速的做简单的东西,你可以不用考虑很多底层的东西,不用考虑数据类型转换,完全不用应用服务器,很快就做出一个应用。但是当应用的体积庞大之后,有一些问题就会暴露出来。这里不说效率,单单是代码的可维护性上,就差java很多。相对来说,java限制比较多,语法比较严格,但这些限制决定了java的程序都会有个风格比较一致的外表,比较容易阅读和维护。
所以一般来说,node不会用来实现比较复杂的业务逻辑。面向对象的语言在控制业务上有很强的能力,比如java。
而且,java流行的时间远比node早,国内很多商业公司,包括银行,他们的业务系统都是java实现的。在这方面,这些公司沉淀了很多经验,也投入了很多资源。即使他们的业务比较适合用node,也是会逐步而不是完全替代java。比如,先用node实现路由和渲染。我现在正在做的项目就是类似这种。
但以上都不是不变的,好的node程序员能写出比烂的java程序员更好的应用,这是毫无疑问的。就像我一位同事所说,java能保证程序的底限,因为它本身就有强制性的诸多原则,而且还有面向对象的诸多知识例如设计模式可供参考。但是node,是没有上限的,同时,也是没有下限的。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
看看2者的社区,再过3年,这个问题的答案就完全不同了。语言不是关键,关键是人,活跃在社区里的人,人才是创造的根本。其实js这种大家都认为是玩具的语言,没想到能走到这一步。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
Node.JS的最大优势就是异步,但是回调增加了编程的复杂度,而且JS对面向对象支持也不好.
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
nodejs适合做简单业务,比如说基于HTTP API接口,相反如果用它来做个,就显得单薄了些。再比如说一些常驻内存的任务,比如说消息队列类的任务,用nodejs也可以做,但是感觉太别扭,这个时候还是感觉java好一些。
当然nodejs的长处就是开发效率高,对于一些业务场景比较单一的公司是比较适合的。
总之,编程语言的选型和公司业务是挂钩的,具体情况也具体分析。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
因为你的问题太简单粗暴:nodejs 是个平台,而 java 是个语言,这两个根本没法直接比较,更不要说中间层这个意思都没表述清楚,那撼动是肯定没戏了;P
我给你一个简单粗暴的回答吧:nodejs 相当于一个没有 IDE 的 ASP.NET,只是单纯轻便快速而已,跟 PHP 之类的相比较还好,Java 就算了,完全不是一种类型的工具。而且 Java 生态更加开放(虽然有 Oracle),总比 Joyent 自己玩好。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
nodejs感觉是给前端往全栈发展而设计的,java更加有历史沉淀,开发稳定迅速,有许多开源的框架。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
nodejs --& V8 --& C++ 解释 --& 编译机器码java --& JVM C++ 解释 --& 编译机器码
理论上, 你可以做 java 做的任何事情. 实际上, js 的数字和字符并没有具体设置, 占用的内存更多, 在进行计算的时候, 没有 java 高效. 而 java 虽然做了具体的数字和字符区分, 但是需要虚拟机和垃圾内存检测, 性能上要远低于 C++ 和 C.
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;
欢迎您订阅我们的技术周刊
我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,
欢迎分享您的观点,经验,技巧,心得
让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;
本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(
订阅邮件周刊
NodeJS会是昙花一现吗?
注意 转载须保留原文链接,译文链接,作者译者等信息。&&
在用了一年以后,我感觉node.js有一点不对劲。它很有意思,但是我觉得我应该用另外一个视角去审视它。网络编程真的可以更容易吗?node.js无疑有一些设计非常好的地方。前段时间我写了一个性能非常高的Syslog Collector系统,它可以每秒处理25万个日志,可以同时处理数千个TCP并发连接。它还支持UDP,HTTP和SSL.它是C++写的,使用了 &架构。它几乎从来不会崩溃。 很少会内存泄露。但是它花了我5个月的时间去编辑(然后重写),测试还有布署。所以,你要知道,写相似的node程序真的不会让你加快开发进度。需要一个HTTP服务器?require(导入)模块,如果你想要一台socket服务器的话,还需要net模块。node是一个事件驱动的框架。相对于为每个链接创始一个线程模型相比有极大的性能优势,node.js取得了无法能取得的成功。 (注* twisted 基于python的异步驱动框架)node.js的问题是什么?JavaScript让我们先说JavaScript - 我喜欢用它的闭包,但是这个语言太扯蛋了。甚至是JavaScriptr的铁杆粉丝都知道它有多可笑。JavaScript the Good Parts (JavaScript好的方面) 真的是一本很簿的书,对比一下你会觉得很有趣。你会发现下面的代码根本不会报错:undefined=42然后你输入这个看看?& [] + []''为什么1个空数组加上另外一个空数组会等于空字符串?然后这个呢?& [] + [] * 5'0'解释JavaScript为什么会这样其实挺困难的。就像为设计的语言。 所以在线编程是非常重要,你得经常打印一下看看到底会输出什么。调试我看到的大多数node.js程序员都在用一种非常原始的方式在调试,并不断地对他们用的工具表示失望。跟踪回调里不该抛出的异常,在类似Mocha和Chai的测试框架中,经常会像恶梦一样。时间不断地花在寻找为什么会出错上面。console.log也许是开发者最常使用的调试工具。回调地狱大多数程序员,只要在node上面写了36个小时的代码,就会发现callback hell。有些&介绍了一些避免的方法。具有讽刺意味的是,这是node的异步和事件驱动所天生的。它带来了很多性能上的优势,但导致了这种难看和不可靠代码的产生。但是我们有。 是的,我同意。不过如果不是用Bluebird这样的模块,我估计大多数node程序员马上就会放弃。我非常喜欢用Promise模式,它写出的代码非常优美。Promise的链式写法是非常好的实践。但是它让你放弃了彻底修复回调地狱的想法。我严重怀疑这一点会破坏NodeJS在生产环境应用的可能性。我只会占用一个核,但只能用一个核。node.js总是运行在一个进程里。这让他进行跨函数和跨模块的调用更加的简单。但这并不意味着是没有代价的,你必须确保你在做出更改的时侯进程不被打断。但是当你使用多核CPU时,你就无法发挥出其它处理器的性能。你就开始骂娘了。当然node里面有集群 &模块,但是它还处在实验阶段,而且用它你还得重写你程序的逻辑。你最初的设计可能很少考虑到需要分布式处理的情况。那么该怎么办?写高性能的网络和分布式程序是当代程序员应有的基本素质。框架应该降低内容的切换——像node一样,允许我们创建高性能的服务器。但是还有比node.js更好的框架。 是一个很好的侯选对象。它基于一个健壮的库,为网络编程而设计。而且编写服务器像node一样容易。 允许程序员不必担心回调式的书写方式,让程序员以更自然的,线性的思维去思考。而且Goroutines真的非常轻量级而且内容切换比操作系统的线程间切换更轻量,这种系统级的线程操作正是node.js想要避免的。Go可以最大可能地发挥多核的优势。这是它的基因。我写了很多Go的代码,而且它的体验要比node要好很多。不要把我的话当回事我的node和JavaScript经验并不像C/C++或Python那样丰富。但是我的直觉告诉我node.js只是我们朝着向更好的网络编程迈进的一步。它已经解决很多问题了,但是应该还有更好的方法。注* 相关阅读,其它反方文章
原文地址:
&热门文章 - 分享最多
&相关阅读 - 我要吐嘈
&关键字 - 瞎扯
&欢迎订阅 - 技术周刊
我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;
我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

我要回帖

更多关于 相比之下 英文 的文章

 

随机推荐