廖恺谈NodeJS在淘宝的应用

个人简介 廖恺,长期从事web系统相关工作,先后供职于百度与兰亭继势,并作为饭否的初创团队一员参与了饭否与海内的创业。现在淘宝数据平台部门任架构师。2004年进入百度,先后参与竞价排名与内容广告项目开发,后负责百度帐号与百度币项目的设计与开发。2007年加入饭否的初创团队,负责web方向的系统设计与开发工作,2010年2月加入淘宝并负责数据平台与产品部门的架构设计工作。目前主要关注web前端技术、node、分布式系统、nosql、云计算、敏捷开发与自动化测试等方向。

QCon全球企业开发大会(QCon Enterprise Software Development Conference)是由C4Media媒体集团InfoQ网站主办的全球顶级技术盛会,每年在伦敦、旧金山、东京、北京召开。自2007年3月份在伦敦召开首次举办以来,已经有包括金融、电信、互联网、航空航天等领域的近万名架构师、项目经理、团队领导者和高级开发人员参加过QCon大会。

   

1. 今天我们有幸请到了淘宝网的廖凯来帮我们分享一些关于Javascript服务端开发的一些话题。听说淘宝运用NodeJS已经有一段时间了?

其实严格意义上来说时间还不长,主要有两块,一块是UED那边,可能在去年的可能下半年的时候有过一些尝试,它可能帮我们淘宝自己的有一个Kissy的前端的框架,迁移成一个后端的版本,这是一块应用;再一个就是在我们现在数据平台这块,就是我所在的部门,我们这边会尝试用NodeJS去做一些处理中间层的服务,这一块。这个呢可能会略晚一些,我们应该是在今年的二月份左右真正开始去实施的,在此之前呢,是一些前期的调研和一些技术积累,到现在应该还处于开发末期,中末期的阶段,可能会在五月份的时候,会真正去把它用在线上的产品中。

   

2. 那现在根据目前使用的情况来看,你觉得它的稳定性和性能如何?

稳定性上面,目前从我们所测试的结论,应该是没有任何问题;性能的话,目前我们是在一个我们开发机上面,一块CPU的话应该能跑到1500个QPS,和我们一开始预计的是基本符合的,也是超过了我们原来用其他技术方案,所实现同样功能,所提供的QPS指数,大概超过了四五倍的样子。

   

3. 我知道淘宝的工程师志愿做了一个社区,cnodejs.org,这个社区现在是什么样一个情况?你们想把它做成什么样子?

社区是我们今年二月份的时候真正开始去把它部署起来的,目前还处于比较初级阶段,我们上面建了一个Blog系统,可能有一个问答的系统,后续我们可能会做更多功能,我们可能会做一些像Wiki,包括我们会推动一些社区交互性的东西。我们甚至接下来考虑做一些,可能会做,做Node的,可能因为有很多写Node程序的人,我们可能会做一些Node Hosting这方面的工作。我们也是希望能够在开发者之间可能更多地去推广这个社区,同时也希望吸收一些比较活跃的开发,或者比较有兴趣的一些开发者,能够进入我们这个,一起来运营这个社区,我希望能用这种模式来做。而不是说仅仅我们淘宝几个人在那捣腾这玩意,让更多人能参与,像这样的模式比较好。

   

4. 这将是一件非常好的事情。那么NodeJS还有Python那种twisted,还有Ruby的eventmachine,都是基于事件模型的,那么NodeJS相对他们两个有什么优点?

这个优点到不是说一定会有,但是只能说它比较一下,像twisted的类似于这种,它可能更多的纯粹是做Web服务的一个框架。那么它从实现上来讲的话,可能和NodeJS的实现其实是比较类似,但是NodeJS它不仅仅是做一个Web服务的框架,它可以做更多,比如它可以做Socket服务,可以做比方说基于文件的,然后基于像一些比方说可以有子进程,然后内部的,它是一个很完整的事件机制,包括一些异步非注射的解决方案,而不仅仅局限在网络一层。同时它可能,即使作为一个Web服务来说,它也提供了更多可以深入这个服务内核、核心的一些功能,比方说Node使用的Http Agent,这块就是它可以更深入这个服务内核来去做一些功能。

   

5. 那么服务端推送呢,在一些实时性要求很高的应用场景下?

这个对于Node,我觉得可以说是最适合的产品之一了,因为Node本身它是可以做到很大的并发扩展。那么传统的,你比方一般的脚本语言,比方说典型的像PHP或者说什么,类似于这样的写,每一个客户端你要开一个Http stream场景保持,对应到最后,你必须要落地,有一个实际的进程产生。那么进程每个进程开销会非常大的,Node如果实现这个方案,我们做过一个简单的聊天室,大概几十多个内存消耗,可以维持接近一千个的那个并发的Http stream链接,这个效率包括系统开销都是非常好的。

   

6. 那HTML5已经支持Web Socket?

对,Node也有很多Web Socket的扩展,它官方正式的核心库中并没有直接的Web Socket支持,它是由很多,因为它核心库给出的接口已经足够,足够强,至少有五六个Web Socket的扩展是可用状态。

   

7. 那我们知道NodeJS是基于Google的V8引擎,它其实是一个单进程,没有线程的机制,甚至包括垃圾回收它也是在主进程里面做的,这对性能会有什么影响?

其实是有影响的,最典型的,如果有很大的串,它会产生很大的性能问题,所以Node为了解决这种Marquee in这种问题,专门提出了Buffer这个功能,它会把一些大量的内存操作,移出Google的V8引擎之外,它额外开辟IO内存,专门去做这些工作。然后同时它在V8那层访问这个内存的指针,这样可以做到很大,同时可以突破V8本身1G的堆容量限制。

   

8. 那英文它的IO操作是异步的,那么是不是说异步的IO一定是更好的呢?

这个不是绝对,因为这是看怎么说,看你的具体需求在哪。异步IO带来的好处就是说,对你的程序来说,你不会因为IO而阻塞。但是异步IO会产生一个问题——磁盘数据碎片化,这样可能是一个连续访问,就会变成一个随机访问了,传统硬盘的随机访问一般都是很差的,可能会有一个问题。但是总体来说,我觉得应该是得大于失,而且同时现在SSD也是越来越普及,随机访问这一块我觉得以后也不会成为今后系统的一个很大的瓶颈。

   

9. 那淘宝的TFS文件系统?

对,我们那边接下来会有些数据产品会采用SSD来做。

   

10. JavaScript调试起来相对还是比较困难的,那NodeJS调试这一块如何?

调试,其实真正的你要是说熟悉了它的模式之后,倒到不会说有多困难,包括它也提供Debug模式,比方它命令提供类似于GDB的Debug,它甚至有人开发了第三方的基于Eclipse的Debug工具。这个其实主要来说,我觉得调试困难可能是由于对开发模式有时候,可能跟传统的开发会完全不一样的思路,可能由于这个代码组织包括这些方面,包括你的可能你的设计,所以导致了你可能不是按传统思路去考虑这个问题了,那么可能会有些不适应。真正如果,就从我目前来说调试还是挺方便的。

   

11. 那您对NodeJS的初学者有什么样的建议呢?

初学者就是,还是刚才我提到的,这是一个全新的思路去考虑你怎么去做这个程序。而不是说,你传统可能说我去读一个文件读完了以后干什么,干什么,像Node里面你可能说我读文件的时候还可以干什么,它是一个另外的不同的思路,或者说你有很长的流程,你可能需要把它根据实际需求切成若干个很多个小的Ticket来做。

   

12. 就像异步队列?

对,因为这样子如果你很长的处理时间,就会把整个进程Block住,所以说可能是开发思路上需要去转变吧。

   

13. 好,那谢谢寥凯今天接受我们的采访。

谢谢!

你可能感兴趣的:(廖恺谈NodeJS在淘宝的应用)