Node.js及MongoDb应用研究
2015-10-18李鹏
李 鹏
(1.英业达集团(天津)电子有限公司 天津 300193;2.天津科技大学电子信息与自动化学院 天津 300457)
目前,国内外市场上的客户关系管理系统(CRM)多采用Java作为基础语言进行设计开发,其安全性、稳定性、系统完善度、架构安全性等得到了很好的保证。但是其开发周期相对较长,人力需求较多,最重要的是Java在高并发的处理上存在一些弊端,很容易造成Server端阻塞 。而Node.js高效的异步事件调度机制和基于javascript的闭包模式较好地解决了这些弊端。
1 Node.js技术及应用概述
1.1 Node.js的定义、功能
Node.js是由 Ryan Dahl编写的服务器端 javascript,其初衷是为了编写更为高效的 Web服务器,它使用当前最快的谷歌V8 javascript引擎和单线程的模式。因为不需要考虑并发,因此也就不涉及锁和阻塞的问题,大大简化了编程。 它的事件回调模型均采用异步操作,如数据库访问都是通过事件来触发的。
Node.js完全发挥了 javascript作为动态解释语言的强大威力,开发人员可以自由使用 javascript的一切特性,如闭包(closure),并且不需要担心跨浏览器支持(因为是服务端)。那么单线程如何处理多用户请求呢?事实上,Ryan观察到 Web访问的一个事实:每次 Web请求服务周期最耗费时间的往往是 I/O 操作,包括读写文件、数据库操作、开启网络等。真正Web 服务内部的运算只占很小的比例。例如浏览器访问一个页面,几乎大部分时间都花在 I/O的读写上,从读文件一直到向接口(socket)写数据,花在页面后端代码的计算量则微乎其微。举例来说,假设 Web Server是一个银行,每个浏览器的访问相当于客户去窗口取一笔钱,客户在某个窗口办理业务相当于服务器从本地硬盘读写文件,这个操作会花很长时间,由于窗口数有限,所以需要一个排队叫号系统,即Node.js线程。当窗口有空时,营业员就通知排号系统叫下一位,但是喇叭一次只播放一个叫号的声音,所以所有通知都存放在了一个事件队列中,排号系统报完一个号再处理下一个,直到队列空为止,然后就处于空闲状态。如果把叫号类比后端代码执行,它的速度就会比处理银行业务快得多,所以只需一个喇叭就足够了。由于没有多线程的切换消耗,所有运算都作用在实际的计算上,从而提高了处理量。
1.2 Node.js的优势
Node.js 在实时的 Web应用上采用了基于 WebSocket的推送技术。这意味着在经过了20多年的基于无状态的请求-返回机制的无状态交互之后,终于有了实时的、双向连接的Web应用,客户端和服务器端都可以发起通信,能够自由地交换数据。与此形成鲜明对比的是传统的 Web响应模式,客户端总是主动发起通信而服务端被动返回。此外,这些都是基于运行在标准80端口上的开放Web组件(HTML、CSS和JS)。
尽管 Flash 和 Java Applet 的形式已经应用很多年了,但实际上这些方式只是使用网络将数据传递到客户端上的沙箱(Sandboxie)环境。它们都是隔离运行的,而且经常操作到需要额外的权限之类的非标准端口。凭借独特的优势,目前Node.js已在许多著名公司的产品中发挥了关键作用。
1.3 Node.js的工作原理
Node.js 的主要思路是:使用非阻塞的、事件驱动的 I/O操作来保持在处理跨平台(across distributed devices)数据密集型实时应用时的轻巧高效。简单讲,Node.js 不是一个即将主导Web开发的银弹(silver bullet)级的平台。相反,它是一个满足特别需求的平台。事实上,使用它进行繁重的计算等于摒弃Node 所有的优点。Node 真正的亮点在于建设高性能、高扩展性的互联网应用,因为它能够处理庞大的、高吞吐量的并发连接。
传统的网络服务技术,是每新增一个连接(请求)便生成一个新的线程,这个新的线程会占用系统内存,最终会占据所有的可用内存。而 Node.js使用非阻塞的异步 I/O 调用,仅运行在一个单线程中,所有连接都由该线程处理,全部挂在该线程的事件循环中,可以允许其支持数万个并发连接。
当所有客户端请求共享单一线程时 Node.js也会出现问题,这也是编写 Node.js 应用的潜在缺陷。首先,大量的计算可能会使 Node 的单线程暂时失去反应,并导致所有的其他客户端的请求一直阻塞至计算结束。其次,开发人员需要非常小心地避免 Exception 阻塞核心的事件循环,因为这将导致Node.js 实例的终止(即程序崩溃)。
2 CRM软件结构及数据库介绍
2.1 CRM管理系统的软件架构
CRM管理系统的软件架构组成如图1所示:
图1 CRM管理系统的软件架构Fig.1 Software architecture of CRM management system
图 1显示了 CRM 系统的工作流程:浏览器端通过 Apps发送请求(Ajax)至后台(Server),后台寻找此请求所对应的方法,这些方法通过与数据库的交互工具(MongoSkin等)来实现对数据的增、删、改、查,再把相应的结果返给 Apps,然后通过 Html及 javescript显示在浏览器(Browser)段,这样就可以将客户数据展示在浏览器端对应的功能区,也可以实现对数据库中所存用户数据的增、删、改、查等处理。
CRM系统中的网页主要是基于HTML、CSS和javascript技术实现的,再通过JQuery、Bootstrap等辅助工具来更好地实现所需功能和页面的美观。
2.2 CRM系统所用数据库MongoDB介绍
开发一个 Web 应用程序,最重要的莫过于数据库的使用。过去 PHP 有 MySQL 当最佳伙伴,而现在 Node.js 有MongoDB 做最佳的组合。MongoDB 是 NoSQL(非关系型数据库)的代表之一,它是一个基于分布式文件存储的数据库,由 C++语言编写,其采用 JSON/BSON 作为数据储存和沟通的格式,亦使用 javascript 做为服务器端(Server-side)的执行语言,一切设计习惯都与 Node.js 非常吻合,搭配使用也方便快捷。
该系统使用MongoDB数据库,它拥有 NoSQL 的普遍特性,不用预先定义数据结构(Schema),并且能够胜任大数据量下任意字段的查询,写入性能高,可写入百万级别的数据。MongoDB比普通关系型数据库快。因此,针对 CRM 系统大数据量的用户数据和ESMS架构所采用的Node.js技术,使用MongoDB数据库。
3 CRM管理系统功能模块设计
CRM 管理系统含用户登录、系统首页平台、用户管理、商品分析等功能模块,基于 Node.js、Html、javascript等技术应用MongoDb数据库搭建了这些功能平台,用户可以依据兴趣或需求点击相关按钮进入相关页面查看。
3.1 用户登录界面模块
用户使用账号、密码完成登录,登录成功会看到系统首页,如登录失败会有失败提示。登录界面如图2所示。
图2 登录界面Fig.2 Login interface
3.2 系统界面设计
系统首页分为 3部分内容:①标题栏为业务功能区,通过点击标题栏中的功能区可以进入到相对应的功能模块;②报表分析区,通过采样将客户数据进行分析和整理,然后以图形的方式直观地显示出来;③登入用户显示及注销区,用户点击登录名后的下拉箭头,可以选择退出系统,也可以修改个人信息情况。
系统首页界面如图3所示。
3.3 客户管理模块设计
客户管理模块界图面如图4所示。
该模块主要有:会员列表、会员自定义分组、会员等级设定等功能。用户点选菜单中的 [客户管理] → [会员列表] 功能,系统显示会员列表界面。会员列表界面可以支持多种分类查询,查询功能包含分组查询和条件查询。
图3 系统首页界面Fig.3 Interface of system homepage
图4 客户管理模块界面Fig.4 Interface of client management module
在页面中输入汇入渠道、姓名、性别、手机号等字段中任意要搜索的值,点击确定,触发以下方法并传入相应参数:
最后将查找出的 json数据返回前台,前台会据此画出对应的表格等操作。
通过以上前后台数据传递代码可以看出,当请求发到Node.js后,它会采用回掉(CallBack)的方式来处理事件,整个过程没有阻塞也不需要等待。基于这样的机制,理论上陆续有用户请求连接,Node.js都可以进行响应,因此 Node.js能支持比 Java、PHP程序更高的并发量,虽然 Java、PHP也可以通过子线程的方式来实现并发请求,但显然 Node.js的回掉函数和异步机制性能更高。由于要实现的操作系统可能会有很多的并发情况和I/O请求,因此采用Node.js和MongoDB的开发模式会更加高效易用。
同样,其他的一些功能模块也是采用类似的逻辑,只是按照不同的需求而搭建不同的页面结构来完成,如商品分析、客户服务、系统数据管理等功能。
4 结 语
介绍了Node.js以及以Node.js为基础开发框架的应用系统 CRM。它使用 Google的 V8虚拟机来解析和执行javascript代码,也可以说 Node.js就等于“运行时环境+库”。它使用单线程和非阻塞I/O,这使得架构性能更好,开发代码更为整洁,同时 Node.js是一个非常靠近底层的工具库或运行环境,可以精细控制 Request 和 Response 的时间和内容,而且它的异步回调模式能够更好地处理大并发事件。因此,CRM 管理系统使用 Node.js可以更好地处理多人操作的并发情况以及大数据量所带来的问题,通过 Node.js的异步模式和其特有的监听方式,可以更好地对用户数据进行统计和采样,使操作人员更好地掌握用户的相关数据。
随着信息化服务时代的到来,Web服务的高效性和准确性也日益重要。综合Node.js的优势,其在未来的Web开发和其他软件开发领域一定会得到广泛应用■。
[1]李松峰.JQuery基础教程[M].北京:人民邮电出版社,2012.
[2][美]Mike,Wilson著;林冀,范俊,张鹏译.Node应用程序构建[M].北京:人民邮电出版社,2014.
[3]黄丹华.Node.js开发实战详解[M].北京:清华大学出版社,2014.
[4]郭远威.大数据存储MongoDB实战指南[M].北京:人民邮电出版社,2015.
[5]Bowers M,Synodinos D,Sumner V.Pro HTML5 and CSS3 Design Patterns[Z].2013:1.
[6]李安瑜.Web Service技术与实现[M].北京:国防工业出版社,2003.