基于时序数据库的GPS处理方案
1 概述
运动中的GPS数据是典型的时序数据,是由设备在一段时间内连续间隔一定时间生成GPS坐标信息。少量设备的GPS信息处理可以用简单的算法处理,但对于成千上万的设备,就需要考虑算法的执行效率。特别是针对大量用于查询的情况下,例如公交车查询、物流查询等。
时序数据库解决了大量用户更新GPS和查询GPS的性能问题,特别是在附近点查询和最近设备的查询方面能够实现非常高效的性能,并且具有高效的截面数据查询,能够瞬时恢复某一时刻的整体场景。一般时序数据库支持的大量数据的插入与高效的单点查询,本时序数据库同样具有。
对于GPS时序数据的处理选择时序数据库,能够使得普通的服务器承受住大量用户对GPS查询的需求,有效降低运营成本。
1.1性能需求
GPS处理性能的具体需求如下:
项目 | 要求 | |
实时数据插入 | 10万个数据源间隔1秒提交 | |
实时查询 | 点信息查询 | 10万事件每秒 |
附近点查询 | 10万事件每秒(返回20个数据) | |
最近的N个点 | 10万事件每秒,N < 20 | |
轨迹查询 | 100事件每秒 | |
历史附件点查询 | 10事件每秒 |
插入与查询效率不能受到数据量增加的影响。
(该性能目前已经验证通过)
1.2接口要求
一条记录所包含的字段可以配置,不同字段可以选择不同的数据类型,并且可以选择不同的索引。
常见的索引如:数组索引、哈希索引、平衡二叉树索引、快速全球索引必须支持。
更新数据和查询数据支持简单的sql语句,并支持insert和delete Sql语句进行设备的增加删除。
2 程序主体结构
2.1模块关系
如下模块间的整体关系图:
图2 模块间的整体关系图
时序数据库为数据核心,支撑与之关联的所有服务器。前端设备和用户与对应的服务器交互。每个服务器都可以处理前端GPS设备和用户的请求。
2.1时序图
GPS设备、服务器与时序数据库的时序图
说明:
随机数由客户端随机生成,用于与数据的密码加密使用,生成鉴权值。具体使用参考鉴权值计算方法。
设备的登录需要告知给数据库,在数据库中插入一个设备ID;退出时告知数据删除设备ID。
用户、服务器与时序数据库的时序图
用户的登录与退出由服务器直接处理,一般用户对于数据库只有查询功能。
3 服务器设计
服务器的模块划分如下:
最底层为通讯层,负责与前端用户、设备或者后端数据库进行实际数据传输。通信层接收到数据后,放入协议解析层的队列中。
协议解析层负责解析收到的数据,组包拆包,判断数据合法性,数据加密解密都在这一层。经过协议解析层的数据,对内是明文可用的,对外是按照格式封装的。解析后的数据放入消息派发层的队列中。
消息派发将解析到数据发送到对应的模块中处理。
用户管理模块管理用户操作,权限验证等,用户的操作只有查询GPS相关信息与数据库关联。
设备管理模块主要是对设备的管理,如设备登录、退出、提交GPS数据,这些操作都需要和后台的数据库关联。
一 附录
1 命令执行结果代码
代码 | 说明 |
2xx | 这类状态代码表明服务器成功地接受了客户端请求。 |
200 | 命令执行OK |
|
|
4xx | 发生错误,客户端似乎有问题。 |
401 | 登录失败,用户名密码错误 |
402 | 没有sessionId |
403 | 权限受限 |
404 | 命令不存在 |
405 | 命令参数错误 |
|
|
5xx | 服务器由于遇到错误而不能完成该请求 |
501 | 服务器忙,无法处理 |
|
|
2 鉴权值计算算法
鉴权值 = MD5(MD5(密码)^随机数)
首先:将用户输入的密码执行MD5算法,得到密文md5Pwd
然后:md5Pwd与随机数执行异或,具体异或方式如下:
随机数 ^ 密码代码如下:
Char rand[4];//四字节随机数
For(int i=0;strlen( md5Pwd );i++)
{
md5Pwd[i] = md5Pwd[i]^rand[i%4];
}
异或得到的值randMd5Pwd。
最后:得到的randMd5Pwd再次执行MD5,最终得到鉴权值。