为什么用Node.js?

3,514 阅读3分钟

今天阿里的考官问了我个问题,为什么选Node.js作为后台主要的开发语言。

我:我们的业务都不复杂,Node.js比较简单,我们都喜欢用Node.js,我们用微服务架构哇,好部署呀。

考官:emmm~,为毛不说点Node.js的优缺点?你以为我真关心你为什么选Node.js么?(我猜他心里这么想的)

有什么特点?

以下都是凭记忆想的,有不对的私信我,我偷偷改。

单进程,异步I/O,事件驱动。这是Node.js最主要的特点。

单进程的优点是不需要像多进程那有互相协调资源,能够节省服务器的开销。缺点是单个线程性的计算能力有限,不能发挥出多核计算机的计算优势。而且一旦出现问题,整个服务将不可用。

目前的应用服务器的制约性能的瓶颈一般是I/O上,也就是读写磁盘。Node.js将所有与I/0相关的操作都做成异步执行的方式,这样主进程现在只要专心处理一些与I/O无关的逻辑处理。因为没有I/O的性能限制,所以能很快的处理来自客户端的请求,提高服务的并发量。

总结一下Node.js的特点,

优点:

  • 单进程,节约资源
  • 异步I/O,提升并发量
  • 语言灵活,别人能写的,JavaScript也要能写。

缺点:

  • 可靠性相对较低,一旦出现未捕获的异常将直接导致服务不可用
  • 单线程计算能力有限,不能很好的利用多核
  • 语言灵活,怎么写的都有。

适合做什么?

根据优点简单推测,Node.js适合做一些高并发的,I/O密集型的应用。

根据缺点简单推测,Node.js不适合做一些计算密集型的应用。

实际的团队配置?

近年其他的开发语言,例如Java、PHP、.NET也都有了异步I/O的处理机制,而Node.js也推出cluster模块来处理多进程的问题,还有V8也一直的在持续优化。

语言的特性并不是一成不变的,语言之间都在相互学习(或者叫抄袭,手动滑稽),所以在我看来其实并不是说有什么应用非什么语言不行。至少说不能用旧有的观念主导我们现在的选择。

比方说,现在的Node.js真的不适合做计算密集型应用么?答案是否定的,可以看一篇IBM的博客浅析 Node.js 在 CPU 密集型问题上应用

文章中使用了一些常见的算法来测试Node.js计算性能,实际发现在很多计算场景中Node.js的计算性能都不差,甚至还比我们通常意义上认为的比较快的C还快些。

文章最后的结论::Node.js 在整体都有不错的表现,即使在某些方面表现不佳,在充分考虑到时间空间复杂度的情况下,可以使用 Addons 特性通过 C/C++扩展来大幅度提高性能。而事实证明,的确得到极大的改善,因此我们有理由相信,Node.js 是能够胜任 CPU 密集型任务的

还在沉浸在几年前说Node.js不适合计算密集型的老旧印象中么?(啪啪打自己脸)

So,除了语言本身的基本特性,什么才是我们在技术选型中真正考虑的呢?

  • 团队成员整体的技术栈更偏向哪种?
  • 能不能满足大部分的需求?
  • 新招的小伙伴哪种更容易上手?
  • 哪种更好招人?(初创公司更重要?)
  • 容器化、微服务这些新东西,哪个更好做、更适合做?(我现在也不清楚)
  • ...

老大的爱好?

老大:Jason,这个项目你觉得用什么做好些?

我:这个复杂、多计算、I/O¥%#%@……#%&!#!

老大:说那么多干什么,我喜欢Node.js。

我:那用Node.js吧。

以上纯属杜撰瞎扯。希望老大没有发现我在编排他