Node.js优点:
1、采用事件驱动、异步编程,为网络服务而设计。其实Javascript的匿名函数和闭包特性非常适合事件驱动、异步编程。而且JavaScript也简单易学,很多前端设计人员可以很快上手做后端设计。
2、Node.js非阻塞模式的IO处理给Node.js带来在相对低系统资源耗用下的高性能与出众的负载能力,非常适合用作依赖其它IO资源的中间层服务。3、Node.js轻量高效,可以认为是数据密集型分布式部署环境下的实时应用系统的完美解决方案。Node非常适合如下情况:在响应客户端之前,您预计可能有很高的流量,但所需的服务器端逻辑和处理不一定很多。
Node.js缺点:
1、可靠性低
2、单进程,单线程,只支持单核CPU,不能充分的利用多核CPU服务器。一旦这个进程崩掉,那么整个web服务就崩掉了。
先简单说一下,node.js官网解释是Evented I/O for
V8 JavaScript。Evented IO实际上单线程epoll/kqueue模型,简单来说就是比select和poll等效率更高的事件驱动模型;而单线程主要是为了减少locking的开销。这两点使得node.js能够同时处理大量的高并发链接(这种模型与nginx,redis以及haproxy的结构也比较类似)。
至于V8,则是相当出色的Javascript引擎,好处是熟悉的人多,人力成本低,开发效率高,同时不失语言的运行效率。
要讲清楚这个问题,先讲讲整个Web应用程序架构(包括流量、处理器速度和内存速度)中的瓶颈。瓶颈在于服务器能够处理的并发连接的最大数量。Node.js解决这个问题的方法是:更改连接到服务器的方式。每个连接发射一个在Node.js引擎的进程中运行的事件,而不是为每个连接生成一个新的OS线程(并为其分配一些配套内存)。Node.js不会死锁,因为它根本不允许使用锁,它不会直接阻塞 I/O 调用。Node.js还宣称,运行它的服务器能支持数万个并发连接。
Node本身运行V8 JavaScript。V8 JavaScript引擎是Google用于其Chrome浏览器的底层JavaScript引擎。Google使用V8创建了一个用C++编写的超快解释器,该解释器拥有另一个独特特征:您可以下载该引擎并将其嵌入任何应用程序。V8 JavaScript引擎并不仅限于在一个浏览器中运行。因此,Node.js实际上会使用Google编写的V8 JavaScript引擎,并将其重建为可在服务器上使用。
不过以上缺点可以可以通过代码的健壮性来弥补。目前Node.js的网络服务器有以下几种支持多进程的方式:
#1 开启多个进程,每个进程绑定不同的端口,用反向代理服务器如 Nginx 做负载均衡,好处是我们可以借助强大的 Nginx 做一些过滤检查之类的操作,同时能够实现比较好的均衡策略,但坏处也是显而易见——我们引入了一个间接层。
#2 多进程绑定在同一个端口侦听。在Node.js中,提供了进程间发送“文件句柄” 的功能,这个功能实在是太有用了(貌似是yahoo 的工程师提交的一个patch)
#3 一个进程负责监听、接收连接,然后把接收到的连接平均发送到子进程中去处理。
在Node.js v0.5.10+ 中,内置了cluster 库,官方宣称直接支持多进程运行方式。Node.js 官方为了让API 接口傻瓜化,用了一些比较tricky的方法,代码也比较绕。这种多进程的方式,不可避免的要牵涉到进程通信、进程管理之类的东西。
此外,有两个Node.js的module:multi-node 和 cluster ,采用的策略和以上介绍的类似,但使用这些module往往有一些缺点:
#1 更新不及时
#2 复杂庞大,往往绑定了很多其他的功能,用户往往被绑架
#3 遇到问题难以解决
Node表现出众的典型示例包括:
1、RESTful API
提供RESTful API的Web服务接收几个参数,解析它们,组合一个响应,并返回一个响应(通常是较少的文本)给用户。这是适合Node的理想情况,因为您可以构建它来处理数万条连接。它仍然不需要大量逻辑;它本质上只是从某个数据库中查找一些值并将它们组成一个响应。由于响应是少量文本,入站请求也是少量的文本,因此流量不高,一台机器甚至也可以处理最繁忙的公司的API需求。
2、Twitter队列
想像一下像Twitter这样的公司,它必须接收tweets并将其写入数据库。实际上,每秒几乎有数千条tweet达到,数据库不可能及时处理高峰时段所需的写入数量。Node成为这个问题的解决方案的重要一环。如您所见,Node能处理数万条入站tweet。它能快速而又轻松地将它们写入一个内存排队机制(例如memcached),另一个单独进程可以从那里将它们写入数据库。Node在这里的角色是迅速收集tweet,并将这个信息传递给另一个负责写入的进程。想象一下另一种设计(常规PHP服务器会自己尝试处理对数据库本身的写入):每个tweet都会在写入数据库时导致一个短暂的延迟,因为数据库调用正在阻塞通道。由于数据库延迟,一台这样设计的机器每秒可能只能处理2000条入站tweet。每秒处理100万条tweet则需要500个服务器。相反,Node能处理每个连接而不会阻塞通道,从而能够捕获尽可能多的tweets。一个能处理50000条tweet的Node机器仅需20台服务器即可。
3、电子游戏统计数据
如果您在线玩过《使命召唤》这款游戏,当您查看游戏统计数据时,就会立即意识到一个问题:要生成那种级别的统计数据,必须跟踪海量信息。这样,如果有数百万玩家同时在线玩游戏,而且他们处于游戏中的不同位置,那么很快就会生成海量信息。Node是这种场景的一种很好的解决方案,因为它能采集游戏生成的数据,对数据进行最少的合并,然后对数据进行排队,以便将它们写入数据库。使用整个服务器来跟踪玩家在游戏中发射了多少子弹看起来很愚蠢,如果您使用Apache这样的服务器,可能会有一些有用的限制;但相反,如果您专门使用一个服务器来跟踪一个游戏的所有统计数据,就像使用运行Node的服务器所做的那样,那看起来似乎是一种明智之举。
总的来说,Node.js的应用场景
1) 适合
JSON APIs——构建一个Rest/JSON API服务,Node.js可以充分发挥其非阻塞IO模型以及JavaScript对JSON的功能支持(如JSON.stringfy函数)
单页面、多Ajax请求应用——如Gmail,前端有大量的异步请求,需要服务后端有极高的响应速度
基于Node.js开发Unix命令行工具——Node.js可以大量生产子进程,并以流的方式输出,这使得它非常适合做Unix命令行工具
流式数据——传统的Web应用,通常会将HTTP请求和响应看成是原子事件。而Node.js会充分利用流式数据这个特点,构建非常酷的应用。如实时文件上传系统transloadit
准实时应用系统——如聊天系统、微博系统,但Javascript是有垃圾回收机制的,这就意味着,系统的响应时间是不平滑的(GC垃圾回收会导致系统这一时刻停止工作)。如果想要构建硬实时应用系统,Erlang是个不错的选择
2) 不适合
CPU使用率较重、IO使用率较轻的应用——如视频编码、人工智能等,Node.js的优势无法发挥
简单Web应用——此类应用的特点是,流量低、物理架构简单,Node.js无法提供像Ruby的Rails或者Python的Django这样强大的框架
NoSQL + Node.js——如果仅仅是为了追求时髦,且自己对这两门技术还未深入理解的情况下,不要冒险将业务系统搭建在这两个漂亮的名词上,建议使用MySQL之类的传统数据库
如果系统可以匹配Node.js的适用场景,那么是时候采取具体的措施来说服老板了。
说服自己老板采用Node.js的方式
构建一个简单的原型——花一周时间构建系统某一部分的原型是非常值得的,同时也很容易和老板在某一点达成一致,等到系统真的在某一部分应用了Node.js,就是打开局面的时候
寻找开发者——首先JavaScript语言的普及度很高,一般公司都不乏Web前端工程师,而此类工程师的学习门槛也非常低。这就意味着Node.js很容易招人,或者公司就隐藏了一些高手
强大的社区支持——Node.js社区非常活跃,吸引很多优秀的工程师,这就意味着公司可以很容易从社区得到免费或者付费的支持
系统性能考虑——JavaScript引擎Google V8,加之原生异步IO模型,使得Node.js在性能的表现非常出色,处理数以千计的并发请求非常轻松
专业公司的支持——使用开源技术的最大问题是,原作者不承诺对其产品进行技术支持或者质量保证。现在Node.js已经得到Joyent公司的赞助,这就保证了未来Node.js的发展是可持续性的
分享到:
相关推荐
Node.js 的缺点包括: * 学习曲线陡峭: Node.js 的异步机制和事件驱动机制需要开发者具备一定的编程基础和经验。 * 不适合计算密集型应用程序: Node.js 不适合计算密集型应用程序,因为它的单线程模型限制了其...
Node.js 的缺点是需要编写代码来实现服务器的功能,需要学习 Node.js 的技术特点和编程模型。 Node.js 是一个服务器程序,旨在提供一种简单的构建可伸缩网络程序的方法。 Node.js 解决了服务器能够处理的并发连接...
- 比较它们之间的优缺点以及适用场景。 - **动态页面生成:** - 讲解如何使用模板引擎生成动态HTML页面。 - 展示如何结合数据库查询结果动态填充页面内容。 - **组件化开发:** - 探讨组件化开发模式在构建...
该项目是一个基于Vue.js、Node.js和MySQL数据库的校园二手交易网站,主要面向大学生...通过完成此项目,开发者不仅能熟练掌握Vue.js、Node.js和MySQL的使用,还能了解SPA架构的优缺点,以及如何构建一个完整的Web应用。
Ansible 部署 Node.js Ansible 是一款自动化部署工具,可以帮助开发者快速部署 Node.js 应用程序。在 CentOS6.x 服务器上部署 Node.js 可以使用 Ansible playbook 来实现。下面是具体的实现步骤: 1. 添加额外的...
Node.js 提供了多种事件驱动编程模型,如回调函数、 promise 和 async/await 等,每种模型都有其优缺点。 构建完整的 web 应用 ------------------- 本书带领读者一步一步地完成一个完整的 web 应用,包括创建...
标题 "Node.js-require-node在前端require后端javascript代码并调用" 涉及到的是将Node.js的模块系统引入到前端JavaScript中,以便在浏览器环境中使用原本只能在Node.js后端运行的代码。这一技术的核心是`require-...
在现今服务器端开发领域,编程语言的选用是一个技术决策的关键部分。PHP和Node.js是两个广受关注的服务器端技术,...通过实际的项目经验,开发者可以更深入地理解PHP和Node.js的优缺点,进而做出更加明智的技术决策。
Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它使得JavaScript可以在服务器端运行,从而打破了JavaScript只能在浏览器中执行的传统。描述中的“用node.js开发网站”进一步确认了这是关于如何使用Node.js...
Node.js 是一种流行的开源后端 JavaScript 运行环境,它使用 Google 的 V8 JavaScript 引擎来执行服务器端的 JavaScript。本书旨在帮助读者从零开始掌握 Node.js 的基础知识,并能够实际编写出功能完备的应用程序。 ...
Node.js是一种轻量级的服务器端JavaScript环境,它基于Chrome V8引擎,具有事件驱动、非阻塞I/O的特性。Node.js广泛应用于构建高性能、可扩展的网络应用,尤其是在I/O密集型的场景下,如实时消息推送、聊天室、协作...
Node.js从入门到精通知识分享 本资源摘要提供了 Node.js 从入门到精通的知识分享,涵盖了 Node.js 的基础知识、 Express 框架、 MongoDB 数据库、 RESTful API 架构、前后端交互、Cookie 和 Session 验证、MVC 架构...
相比之下,Node.js 是基于 JavaScript 的后端开发平台,以其非阻塞I/O和事件驱动模型而闻名。这使得Node.js在处理大量并发请求时表现出色,特别适合构建实时应用和高流量的Web服务。Node.js 的 V8 引擎提供了一流的...
Node.js 是一个强大的开源开发平台,它基于 Google 的高性能 V8 JavaScript 引擎,使得 JavaScript 能够在服务器端运行,不再局限于浏览器环境。这个技术的出现极大地拓展了 JavaScript 的应用范围,使得开发者可以...
**四、Node.js 的优缺点** 优点: - 高效、轻量级 - 强大的生态系统 - 一次编写,到处运行(Write Once, Run Everywhere) - 适合构建高并发应用 缺点: - 单线程模型可能导致CPU密集型任务处理能力不足 - 错误...
Node.js网络应用程序了解每个Node.js网络应用程序和现有网络应用程序的特征,优缺点,以及这两种方法之间的差异。 参考链接: : 现有网络应用网络I / O以基于线程的同步方法处理。 多线程网络应用程序。基于线程的...
Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行编程,从而打破了JavaScript只能在浏览器中运行的传统。Node.js利用非阻塞I/O和事件驱动模型,使其在处理高并发请求...
为了适应现代人类强烈的时间观念,对于二手书交易传统管理方式的缺点,互联网的出现打破了这种局限性,给了广大用户更大的选择空间,促进了基于Node.js的二手书交易平台系统,有效的避免了二手书交易管理缭乱的局面...