过年7天乐,学nodejs 也快乐

自从上次接触nodejs 已经好长时间了,但是年底公司太忙了 ,没时间看,

上次文章在ubuntu上安装nodejs[开启实时web时代] http://www.cnblogs.com/qqloving/p/3286001.html 2013-08-27

过年回家,家里没网,作为一个战斗型屌丝,自然不能错过如此学习机会,于是买了两本书 一本《深入浅出nodejs》一本《写给大家看的c++》

看完nodejs 有点感觉,是移动互联网时代不错的技术选型,相信,5年后nodejs在中国一定会火起来,就像10年前c#刚出来,标榜为net 而生一样。

 

1 首次在底层将性能的核心由单台服务器提升到服务器节点组合

传统上大部分程序设计性能优化和核心都是在提升单台服务器的性能,而对服务器节点组合性能提升缺乏考虑。

一方面是,在独立软件服务提供商时代,过去80%的程序都运行在单台服务器上

另一方面是,在计算机结构上,cpu最快,内存次之,硬盘最次,网络io性能最烂,所以传统计算机都围绕这cpu 、内存、硬盘进行设计。这可以理解为时代局限性。

前几年,ruby 再次在单台服务器的性能上要求下滑一下,从而使开发效率在提高一次,但这几年发现ruby风似乎小了,为啥呢?

个人认为开发效率乃是微软的绝杀领域,ruby想要依靠开发效率在编程世界混一席之地,谈何容易,加之开源世界不是很重视开发效率,而重视可阅读,可扩展,可维护,促使ruby风刮的快,走的也快,而且高开发效率很容易出现零和游戏【1个人埋BUG,1个人改bug,一个人排期,看着每个人都很辛苦,都很努力,都应该加工资,但是从老板角度,结果维持为0】

nodejs的出现,彻底把性能分为cpu性能和io性能,而在io性能上采取异步回调机制,彻底消灭了计算机之间通信造成的等待堆积,造成的性能问题,

并发量大时候,大量的等待压垮 服务器在传统服务器和应用上似乎是家常便饭,这可能要和nodejs说 拜拜了

传统web服务器应对海量并发 nodejs 服务器因对海量并发
微博桌面截图_20140208200906

传统的web服务器因为单台服务器可以承受的链接数有限,所以就弄一大堆海量服务器来分担负载,

但是单台服务器的业务逻辑依然很复杂,软件开发的复杂度整体上依然没有降低,不信,你看看你的各种性能调优和可维护行的知识,是不是围绕单台服务器的.例如高性能的***

标志

很少写一个循环里面掉接口




微博桌面截图_20140208201239
node js因为单一线程就可以处理很高的并发,所以每台服务器只须处理一点点业务逻辑,由一个队列上的其他服务器处理其他逻辑,这样,单台服务器的复杂度就极大的降低,我认为复杂度是性能的天敌,只有消灭复杂度,才能有可靠的性能



标志
一个循环里面掉接口很正常

2 nodejs自身及服务器和单线程的脆弱性

我也不知道nodejs是不是史上第一次自身就是服务器的编程工具,我资历太浅,才work4年,nodejs是我见到的第一个自身就是服务器的编程工具.

nodejs 是单线程,遇到未知错误就自动退出了 。

为什么说nodejs脆弱呢,我是这么推理的以.NET和iis为例子

1 .NET APP 普通异常 黄页                                                     普通

2 .NET APP的 iis程序池异常 程序退出                          严重

3 .NET iis 异常 这台服务器上的所有iis托管的程序异常        超级严重

大家平时写程序 黄页似乎是加长便饭,即使是程序上线了,该黄页的时候,还是黄页,但是程序整体是没问题的

iis程序池无法启动和iis异常就很少见了可以忽略了

但是在nodejs中,就完全不一样 ,1和2放在一起了,因为nodejs 自身就成程序池,而且是单线程,只要出现一次异常,该线程就 退出了

这就好像以前大家只犯错误1 犯错1000次才可能遇到1次错误2,在nodejs中犯一次错误就直接是错误2

在nodejs 风挂起来后,国外紧跟着的就是js的测试驱动的很多讨论和实践,框架出了一个又一个,为啥呢?nodejs有需求呗

3 v8内存限制和cpu、io压力分散、事件循环问题

node 的v8 内存限制 一个线程的内存在32位和64位下都默认没有突破2g内存,传统的web服务器,压力一上来,内存很快就上去了,更不用说内存比较大的操作了

node 通过异步机制加强了对cpu 和io的利用,造成了设计程序时候要先预判,我这个程序是cpu 密集呢还是io密集呢?

说实话 2013年, 通过很多事件 我才意识到 原来IO 是个很深的领域,很久以前一直认为io没啥简单的和1一样。。。。。

node 整体上是依靠事件循环机制驱动,像递归程序非常消耗node的事件循环,很可能就造成堆栈溢出 程序退出 ,所以一般循环递归用c++写插件

这几个因素和到一起,就造成node 设计程序模块时候 要更细致,技术粒度更细

就像一个普通的站点 用.NET 开发什么都干了 但是node 可能就不是这么回事了,例如 文件上传、验证码生成 ,检索服务,正则表达式服务等等,基本上看上去 高cpu 和高内存的模块 都要剥离出来

4前后端模型风格一致和c++

为啥nodejs 出现后全堆栈开发就屡屡上头条呢?,NET 程序员写js的时候怎么没人说全堆栈开发呢?

为啥呢?因为,有人绝望了,再加上移动互联网的普及的加速,在服务器端生成html后到客户端渲染已经OUT了

[ps:seo也out了,因为移动端链接不存在了]

so 一群被压抑很久的身怀js绝技的人,拿着nodejs神器,在短短4年时间,几乎攻下了web开发的各个角落,从未有一门语言在4年时间内取得如此成绩.c#用了10年 才勉强取代了自己的大哥asp的市场份额,可见nodejs是多nb

[ps:随着我国人口老龄化,新生人口减少,用人成本提高,不同分工的沟通成本将会年年上升]

全堆栈的nodejs 和宇宙效率最高的.NET 技术股票值得长期持有,尤其是要创业的各位伙伴们

微博桌面截图_20140208211801

一直都想看看c++ 但是,NET这个大而全的平台上一般遇不到啥问题需要用c++解决,

最起码nodejs 递归程序得用c++写

nodejs 就不一样,有一堆问题需要,所以过年就顺便看看了c++,整体感觉c++没有刚上大学时候在图书馆里面看的那么难了微笑.

感觉c++理论上也入门了 就剩下写nodejs 时候谢谢c++练手了微笑

这也说明学习.NET 是快速进步的途径,想学啥就学啥,我效率高,我怕啥,

5如何学习nodejs web开发?

根据我多年学习经验

快速学习web开发的渠道 最快的是

抓取数据->整理数据->展示数据->程序优化 

题目选好了说不定还能挂点广告把服务器钱挣回来呢

so lets go O(∩_∩)O~

                                                                                                               我实践mvc TDD的项目  http://www.unknownerror.org/ 

                                                                                                                有时间 再弄个nodejs版本的

posted @ 2014-02-08 22:10 互联网Fans 阅读(...) 评论(...) 编辑 收藏