2. 武汉大学计算机学院,湖北武汉 430072
2. Computer School,Wuhan University,Wuhan,Hubei,430072,China
【研究意义】近年来,随着基于位置的服务(Locationbased Services,LBS)应用的不断发展,以及云计算、大数据等技术的兴起,数据正以前所未有的速度增长和累积[1]。基于这些数据的Web服务和应用对后台数据库提出更高的要求,而传统的关系数据库在海量数据的高并发读写、高效率存储访问以及高可扩展性方面已经显得力不从心,非关系型数据库(NoSQL)是目前应对这一问题的有效方案[2-3]。NoSQL是一个云计算背景下的分布式、非关系型数据库系统,支持半结构化、结构化数据的高并发读写,具有良好的可伸缩性和可扩展性[4]。MongoDB是一个面向集合的、模式自由的文档型数据库,旨在为Web应用提供可扩展的高性能数据存储解决方案。【前人研究进展】近年来,关于MongoDB的LBS研究和应用日趋深入。在学术研究方面,吴飞[5]利用MongoDB的地理空间索引,研究基于MongoDB的LBS数据管理系统关键技术;刘卓[6]利用MongoDB分布式部署方案,实现对存储在 MongoDB 集群架构上的空间数据进行读写、查询操作,经过对数据存取性能的综合分析,验证此种基于NoSQL的空间数据云存储方案是高效可行的;宋平亮[7]基于MongoDB和Node.js研究航道数据的Web服务和应用,实现在Web地图上进行指定区域查询、坐标点临近查询、复合地理空间查询和航迹查询等一系列船舶监控功能。在基于MongoDB的LBS应用方面,快的打车在其出租车打车核心业务中使用MongoDB;奇虎360也在MongoDB上构建众多应用,其中包括外部面向用户的服务以及内部商业应用。【本研究切入点】MongoDB原生支持地理位置索引,可直接用于位置距离计算和查询,而且在性能上也能高度优化[8]。据此,本研究基于MongoDB实现出租车GPS位置数据的高效存储与查询服务。【拟解决的关键问题】结合NoSQL数据库与Node.js Web技术探讨出租车数据的Web服务和应用,提出一种高响应的海量位置数据存储、管理以及Web应用的解决方案。
1 出租车GPS数据Web服务方案体系架构近年来,位置服务(LBS)需求呈大幅度增长趋势,从地址点导航到兴趣点推荐,不仅可引导用户找到附近的产品和服务,还可获得更高的便捷性和安全性。然而,部分LBS应用仍采用关系型数据库来管理数据。从GPS数据管理角度来看,海量数据无时无刻不在产生,关系数据库难以支撑海量数据的存储和管理,成为制约LBS应用发展的瓶颈。因此,本研究基于NoSQL数据库,提出一种出租车位置数据的存储模型,利用MongoDB的地理空间索引及查询机制,结合Node.js Web服务技术,研究这些数据的服务和应用模式,以期为海量GPS位置数据的存储、管理以及Web应用提供一种有效的解决方案。
基于上述思路,本研究构建出租车GPS数据的Web服务方案体系架构(图 1),从软件层次上划分为以下3层:
(1) 表示层:是面向用户的显示和交互界面,可以运行于Web浏览器或移动端。该层负责用户查询交互、从Web服务层接口获取数据并在地图可视化显示等操作。其中,HTML构建Web页面结构,CSS渲染样式,JavaScript完成数据解析以及地图API调用。
(2) Web服务层:基于Node.js技术提供HTTP服务以及REST风格的Web service服务[9],包括处理路由、模板、数据获取等。该层以Express为开发框架,Embedded JavaScript(EJS)作为模板引擎,通过Mongoose实现MongoDB数据库操作。
(3)数据库层:负责存储出租车GPS数据,包括数据库构建、原始数据的迁移、地理索引的构建等。
1.1 关键技术 1.1.1 Node.js技术Node.js是一个可以让JavaScript运行在服务器端的平台,用于方便地搭建响应速度快、易于扩展的Web应用。Node.js使用事件驱动、异步式I/O 模型而得以轻量和高效,同时使用Module模块划分不同的功能,以简化应用开发[10]。
Node.js可以很方便地通过相应的数据库驱动模块与MongoDB实现数据库连接。Mongoose是MongoDB Node.js数据库驱动,提供一种在Node环境中操作MongoDB数据库的便捷封装。它包装更高层次、更直接的API语法,通过Schema方式将数据库中的数据转换为JavaScript对象以供应用使用[11]。
1.1.2 Express架构Express是一个基于Node.js平台的极简、灵活的Web应用开发框架[12]。Express架构是一个典型的MVC(Model View Controller)框架(图 2),用户通过浏览器发起请求,由路由控制器接受,并根据不同的路径定向到不同的控制器。控制器处理用户的具体请求,可能会访问数据库中的对象,即模型部分,从模型获取数据。然后,调用模板引擎生成HTML页面,最后由控制器返回给浏览器,完成一次请求。
在Express MVC架构中,模板引擎以数据和页面模板为输入,生成 HTML 页面。Embedded JavaScript(EJS)是一个JavaScript实现的标准模板引擎,具有易于学习、维护性良好的HTML代码结构[13]。
Node.js使用JavaScript作为服务器端的执行语言,可以与MongoDB很好地配合开发Web应用。因此,本研究结合MongoDB与Node.js技术开展研究,以Express为开发框架、EJS作为模板引擎、Mongoose实现数据库连接。
1.2 出租车GPS数据库构建 1.2.1 数据模型出租车GPS数据信息包含车牌号、采集时间、采集点经度与纬度、车辆状态、行驶速度、行驶方向等7个要素,其详细描述如表 1所示。
区别于关系型数据库,MongoDB是一个模式自由的数据库,意味着存入数据之前并不需要事先定义数据结构与类型。MongoDB的逻辑结构由文档(document)、集合(collection)、数据库三部分组成,其中文档相当于关系数据库中的一行记录,集合对应于关系型数据库里的表。将关系数据模型映射到MongoDB中即为MongoDB文档数据模型,其json格式描述如下:
{
“_id”:ObjectedId(“56ee181abb27d9f253cd078-6 ”),
“name”:”粤B000H6”,
“time”:”2011/04/18 00:08:01 ”,
“jd”:114.118286,
“wd”:22.573967,
“status”:0,
“v”:22,
“angle”:3
}
1.2.2 地理索引设计在MongoDB中,建立地理索引的键必须是一对值,即包含两个元素的数组或包含两个键的内嵌文档。在关系型数据模型中,出租车位置由2个字段描述,如果将其直接映射到MongoDB则会形成2个独立的键值对{"jd":114.118286,"wd":22.57396},无法直接创建地理索引,因此需要对该两个字段进行合并(“gps”:[114.118286,22.573967]),然后才能创建地理索引。合并后的MongoDB文档模型如下所示:
{
“_id”:<ObjectedId>,
“name”:”粤B000H6”,
“time”:”2011/04/18 00:08:01”,
“jd”:114.118286,
“wd”:22.573967,
“status”:0,
“v”:22,
“angle”:3,
“gps”:[114.118286,22.573967]
}
1.2.3 数据查询方案MongoDB支持邻域查询($near)和范围查询($within)。$near命令将指定坐标附近的记录按照由近到远的顺序返回。$within区域查询则返回某区域内的所有对象,区域可以是矩形、圆形或多边形。其中,矩形区域查询通过左上点和右下点来指定矩形范围,圆形区域查询通过圆心与半径来指定圆形范围,多边形区域查询则需要指定多边形的各个顶点。
1.3 基于Node.js的出租车GPS数据Web服务设计与实现出租车GPS数据Web应用采用Express MVC框架,分为对象模型层、控制器层与视图层3层,下面将逐层介绍Web服务的设计与实现。
1.3.1 对象模型层Mongoose是MongoDB的一个对象模型工具,封装MongoDB对文档的增删改查(CRUD)操作。该层主要完成出租车对象模型设计,首先根据出租车数据表创建对象Schema,然后将其发布为Model模型。这里,Schema仅是一种数据库原型或模型骨架,并不具备数据库的操作能力。Model则是由Schema构造来的,除具有Schema定义的数据库骨架以外,还具有数据库操作行为。出租车对象模型关键javascript代码如下:
var mongoose=require(‘mongoose’);//导入mongoose模块
var Schema=mongoose.Schema;
var TaxiSchema = new Schema({
name:String,
time:Date,
jd:Number,
wd:Number,
status:Number,
v:Number,
angle:Number
});//定义Schema
exports.Taxi=mongoose.model(‘Taxi’,TaxiSch-ema);//将Schema发布为Model
1.3.2 控制器层控制器层负责系统的业务逻辑实现,通过Express路由控制实现客户端请求URL的路径映射功能。根据系统功能需求与REST设计风格,设计路由(表 2)。
下面以“/WithinCenter”的路径处理为例,简述“区域查询(圆形)”的设计过程:首先从客户端获取用户查询条件,包括用户位置信息与圆形区域检索半径,然后执行mongodb查询并提取数据,最终返回查询结果到客户端(图 3)。
在视图层EJS模板中,静态部分由HTM5页面实现,动态部分则嵌入EJS标签。视图层设计中,地图显示直接调用腾讯地图API[15]来实现,时间查询通过简单的时间选择对话框完成,区域设置则通过简单的文本框设置,查询结果json数据由EJS引擎渲染到页面并在地图标记,其页面设计示例——“区域查询(圆形)”如图 4所示。
本研究搭建Node.js Web开发环境,数据库层分别选用MongoDB与MySQL,对Web服务在区域查询方面进行性能对比,实验环境如表 3所示。其中,MySQL通过MySQL Spatial Extensions(空间索引)[16]实现区域查询。实验数据采用2011-04-18至2011-04-26的深圳市出租车GPS轨迹数据,车辆总数为13 799台,数据文件约1.7亿条记录,数据总量大小约10 G。
试验分别对MongoDB与MySQL所存储的相同数据集的不同量级(从50 MB到500 MB)进行半径为0.5 km和1 km的地理范围查询,连续多次测试并取平均值。当数据量小于150万条,两者的Web响应时间差别并不明显;随着数据规模增加,MySQL Spatial的查询耗时剧增,接近直线趋势;而MongoDB耗时很少,并且增幅不大(图 5)。
将查询区域半径扩大至2.5 km的几何区域时,实验发现,基于MySQL Spatial的查询响应时间已远超出可等待的范围,因此只测试MongoDB的查询性能。从图 6可以看出,随着数据量增大,MongoDB Web响应时间有所增加,但整体耗时很少,可以支持地图实时浏览。
位置数据的高速增长态势,给海量空间数据分布式存储、管理与网络在线服务提出了巨大的挑战。MongoDB数据库原生支持地理位置索引并且性能高度优化,Node.js可以方便地搭建轻量、高效和易于扩展的Web服务,本文结合MongoDB数据库与Node.js Web技术,探讨一种出租车GPS数据的Web服务方案。实验结果验证该方案具有较好地时效性,为更高层次的应用提供参考。
[1] |
孟小峰, 慈祥. 大数据管理:概念、技术与挑战[J]. 计算机研究与发展, 2013, 50(1): 146-169. MENG X F, CI X. Big data management:Concepts,techniques and challenges[J]. Journal of Computer Research and Development, 2013, 50(1): 146-169. |
[2] |
BANKER K. MongoDB实战[M]. 北京: 人民邮电出版社, 2012. BANKER K. MongoDB in Action[M]. Beijing: Posts & Telecom Press, 2012. |
[3] |
申德荣, 于戈, 王习特, 等. 支持大数据管理的NoSQL系统研究综述[J]. 软件学报, 2013, 24(8): 1786-1803. SHEN D R, YU G, WANG X T, et al. Survey on NoSQL for management of big data[J]. Journal of Software, 2013, 24(8): 1786-1803. |
[4] |
CATTELL R. Scalable SQL and NoSQL data stores[J]. ACM SIGMOD Record, 2010, 39(4): 12-27. |
[5] |
吴飞. 基于MongoDB的LBS数据管理系统关键技术研究[J]. 测绘通报, 2014(7): 121-124. WU F. Key technology research of LBS data management system based on MongoDB[J]. Bulletin of Surveying and Mapping, 2014(7): 121-124. |
[6] |
刘卓.基于NoSQL的空间数据云存储的研究[D].开封:河南大学,2014. LIU Z.Research of Spatial Data Cloud Storage Based on NoSQL Database[D].Kaifeng:Henan University,2014. http://cdmd.cnki.com.cn/article/cdmd-10475-1014398210.htm |
[7] |
宋平亮.基于MongoDB的航道数据Web服务研究[D].大连:大连海事大学,2015. SONG P L.Research on Channel Data Web Service based on MongoDB[D].Dalian:Dalian Maritime University,2015. http://cdmd.cnki.com.cn/article/cdmd-10151-1015656903.htm |
[8] |
STEVIC′ M P, MILOSAVLJEVIC′ B, PERIŠIC′ B R. Enhancing the management of unstructured data in e learning systems using MongoDB[J]. Program Electronic Library and Information Systems, 2015, 49(1): 91-114. DOI:10.1108/PROG-11-2013-0063 |
[9] |
黄扬子. 基于NodeJS平台搭建REST风格Web服务[J]. 无线互联科技, 2015(16): 57-59. HUANG Y Z. Build a REST style web services based on Node JS[J]. Wireless Internet Technology, 2015(16): 57-59. |
[10] |
郭家宝. Node.js开发指南[M]. 北京: 人民邮电出版社, 2012. GUO J B. Node.js Development Guide[M]. Beijing: osts & Telecom Press,2012., 2012. |
[11] |
Mongoose Document [EB/OL].[2015-05-07].http://www.nodeclass.com/api/mongoose.html.
|
[12] |
STRONGLOOP.Express[EB/OL].[2016-05-20].http://www.expressjs.com.cn/.
|
[13] |
BITOVI.EJS [EB/OL].[2016-05-11].http://www.embeddedjs.com/.
|
[14] |
GOMAA H. 软件建模与设计:UML、用例、模式和软件体系结构[M]. 北京: 机械工业出版社, 2014: 96-100. GOMAA H. Software Modeling & Design:UML,Use Cases,Patterns,& Software Architectures[M]. Beijing: China Machine Press, 2014: 96-100. |
[15] |
腾讯地图开放平台JavaScript API V2[EB/OL].[2016-05-21].http://lbs.qq.com/javascript_v2/index.html. Tencent Map Open Platform JavaScript API V2 [EB/OL].[2016-05-21].http://lbs.qq.com/javascript_v2/index.html. |
[16] |
张明波, 申排伟, 陆锋, 等. 空间数据引擎关键技术与应用分析[J]. 地球信息科学, 2004, 6(4): 80-84. ZHANG M B, SHEN P W, LU F, et al. Analysis and discussion on spatial data engine technologies[J]. Geo-information Science, 2004, 6(4): 80-84. |