过年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 服务器因对海量并发 |
![]() 传统的web服务器因为单台服务器可以承受的链接数有限,所以就弄一大堆海量服务器来分担负载, 但是单台服务器的业务逻辑依然很复杂,软件开发的复杂度整体上依然没有降低,不信,你看看你的各种性能调优和可维护行的知识,是不是围绕单台服务器的.例如高性能的*** 标志 很少写一个循环里面掉接口 |
![]() 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 技术股票值得长期持有,尤其是要创业的各位伙伴们
一直都想看看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版本的
过年7天乐,学nodejs 也快乐的更多相关文章
- nodejs 视频教程《一起学nodejs》
一起学nodejs 讲师: matthew vscode+nodejs4.6 http://list.youku.com/albumlist/show/id_27966955.html?spm=a ...
- 开始学nodejs —— 调试篇
新学习一种技术,肯定会遇到很多坑,我们需要找到这些坑,弄清楚这些坑出现的原因和其中的原理.这种操作就叫做调试. 程序调试的方法和工具多种多样,在这里我总结一下我在学习nodejs的过程中,学到的和用到 ...
- 开始学nodejs——net模块
net模块的组成部分 详见 http://nodejs.cn/api/net.html 下面整理出了整个net模块的知识结构,和各个事件.方法.属性的用法 net.Server类 net.Socket ...
- 边走边学Nodejs (基础入门篇)
1.什么是Node.js Nodejs ,或者node, 是一个基于ChromeJavaScript执行时建立的平台.用于方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件驱动, 非堵 ...
- 我们是怎么管理QQ群的
文章背景:腾讯平台上的qq群数以千万百万计,但99%的在吹水扯蛋,从早上的问好开始,到晚上的晚安,无一不浪费青春之时间,看之痛心,无力改变,只好自己建了一个,希望能以此来改变群内交流的氛围或环境. 以 ...
- github上最全的资源教程-前端涉及的所有知识体系
前面分享了前端入门资源汇总,今天分享下前端所有的知识体系. 个人站长对个人综合素质要求还是比较高的,要想打造多拉斯自媒体网站,不花点心血是很难成功的,学习前端是必不可少的一个环节, 当然你不一定要成为 ...
- 前端资料QQ群交流
转:https://github.com/jsfront/src/blob/master/qq.md 这本来是我QQ群内部的一份公共约定的日常交流规则,后来得到大伙的一致认可,并用实际行动来捍卫它,使 ...
- 【JavaScript&jQuery】前端资源大全
综合类 综合类 地址 前端知识体系 http://www.cnblogs.com/sb19871023/p/3894452.html 前端知识结构 https://github.com/Jackson ...
- JavaScript资源分享
一. 资源教程: 综合类 前端知识体系 前端知识结构 Web前端开发大系概览 Web前端开发大系概览-中文版 Web Front-end Stack v2.2 En类资源汇总 免费的编程中文书籍索引 ...
随机推荐
- SQL SERVER 2005修改数据库名称,包括物理文件名和逻辑名称
SQL SERVER 2005修改数据库名称,包括物理文件名和逻辑名称 原来数据库名称为 aa,物理文件名称为 aa.mdf 和 aa_log.ldf: 需要修改数据库名称为 bb,物理文件名 ...
- solr 添加索引
添加索引模板: <add> <doc> <field name="employeeId">05991</field> <fie ...
- gradle下载地址
gradle下载:http://services.gradle.org/distributions
- BZOJ4596: [Shoi2016]黑暗前的幻想乡
Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖 怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类) 博丽灵梦和八云紫等人整日高谈所有妖怪 ...
- How to make your assembly more secure from referencing by unauthorized bits
Now the security has a trend to become more and more important in our daily work, hence I did some r ...
- java的基础知识文件操作和标识符
1.文件夹的操作 dir :显示当前文件夹中的所有文件和文件夹. cd 路径: 进入到指定的路径. cd .. : 回到上一级目录 cd \ : 回到当前目录的跟目录 md 文件夹名 创建一个 ...
- 6_PHP AJAX MYSQL
XAMPP套装软件: 包含Apache.MySQL.PHP等多个开源软件的集合. https://www.apachefriends.org/zh_cn/index.html 监听完整相应消息: Wi ...
- Python 爬虫2——环境配置
关于环境配置的操作,其实非常简单,假如不使用第三方的框架的话,只需要安装Python即可完成后续的操作. 一.Python的安装和配置: windows系统的安装配置过程如下,假如是Mac系统,可参考 ...
- [原创]MySQL innodb_rollback_on_timeout参数对锁的影响
环境:Server version: 5.6.21-log MySQL Community Server (GPL) 前提提要: innodb_rollback_on_timeout是 ...
- Javascript初学篇章_8(事件)
事件 HTML 事件是发生在 HTML 元素上的事情.例如用户点击按钮时,点击也是一个事件.事件可以用于处理表单验证,用户输入,用户行为及浏览器动作,如: 页面加载时触发事件 页面关闭时触发事件 用户 ...