求友们帮助,大量 GPS 轨迹数据利用 MongoDB 数据库如何存储呢(SpringBoot+ MongoDB)

2023-07-30 18:23:14 +08:00
 Allenxup

有大约 500 辆车 每辆车绑定 1 台 GPS 有线设备,每天大概运行 16 小时 运动状态下每 10 秒上报 1 条 gps 数据,静止状态下每 5 分钟上报 1 条。数据对接的是第三方 GPS 平台。

需求 1:需要实时同步轨迹数据到自己 MongoDB 库中,目前第三方可进行推送数据,我方只需要提供 http 接收接口。 现在问题是只要数据接收接口挂了,就无法接收到数据了,要如何保证数据不丢失呢

需求 2:在大量 GPS 数据情况下如何利用 MongoDB 如何存储呢,需要实现的功能:轨迹查询、区域查车、查询所有车辆当前位置。表结构改怎么设计比较合理呢?

3933 次点击
所在节点    程序员
47 条回复
Allenxup
2023-07-31 13:39:03 +08:00
@roundgis 十亿数据查询轨迹速度如何?
Allenxup
2023-07-31 13:42:41 +08:00
@Desdemor ck 是啥
Desdemor
2023-07-31 13:58:12 +08:00
@Allenxup ClickHouse 哇
Allenxup
2023-07-31 13:58:55 +08:00
@Desdemor 明白了,感谢
Desdemor
2023-07-31 14:03:56 +08:00
@Allenxup 我们也有类似的业务,查询那是相当的快了,你可以先存到 redis,然后批量写入
Allenxup
2023-07-31 14:17:05 +08:00
@opengps 有个问题请教,轨迹数据 WGS84 坐标转百度坐标,放前端转还是后端转比较好呢
opengps
2023-07-31 14:33:45 +08:00
@Allenxup 我建议是放在后端,这样可以用额外的 webapi 去进行处理,前端只管使用数据成果即可。
我之前是同时存储 2 份数据,这样遇到比如计算里程的时候,直接使用原始坐标可以更高的理论准确度。实际用下来却发现意义不大,虽然两套标准并没有线性关系,但是在较多点的场景下,互相填补之后的里程计算结果基本就接近均匀坐标了
Allenxup
2023-07-31 14:42:54 +08:00
@opengps 我这边也是放后端处理,但是在轨迹坐标转换部分耗时比较长,导致查询轨迹耗时 6s 左右,有什么解决办法吗
opengps
2023-07-31 14:48:49 +08:00
@Allenxup 那你得自己验证下了,思路:
1 ,硬盘速度跟上,看下磁盘队列有没有占满或者拉长
2 ,sql 索引使用情况,比如我早期版本关系型数据库,天然就给查询只提供一种方式,一定会命中索引
3 ,sql 一次读取量大小,sql 查询效率之外,那就是看你数据从硬盘到内存的总大小是不是满速传输依然需要 6 秒了,可以根据需要缩减需要返回的字段数量
4 ,其他处理,有没有额外在程序里过滤或者排序,或者替换补充数据等等,能回归到原始的硬盘读写,就不要去费劲转换
5 ,网络传输,服务器到客户端经过的网络带宽跟你序列化之后的结果集大小换算下耗时
opengps
2023-07-31 15:04:07 +08:00
@Allenxup 刚注意到附言,我都是入库时候先纠偏在入库,因为只查询一个点,所以单个流程里耗时很低

另外,大家可能不知道,早期的方案多数人不是用联网查百度 webapi,而是自己采集的本地纠偏数据库,现在限制并发了总量了,采集不动了。
Allenxup
2023-07-31 15:13:21 +08:00
@opengps 感谢解答。你的意思是坐标转换后再入库吗
opengps
2023-07-31 15:14:46 +08:00
@Allenxup 是的。几乎所有核心功能全是在后端完成,包括围栏之类的
Allenxup
2023-07-31 15:23:52 +08:00
@opengps 但是考虑到以后如果换其他地图的话就麻烦了,不太灵活
malaohu
2023-07-31 15:29:26 +08:00
上一个消息队列,分别用消费者处理业务。包括你得坐标转化。
opengps
2023-07-31 15:29:35 +08:00
@Allenxup 所以需要存原始坐标,毕竟有些地图标准只支持单向转化,你可以自己决定备用转化字段的存储结果是什么标准的。在所有的资源中,存储换效率是最低成本的
QWE321ASD
2023-07-31 17:19:45 +08:00
之前用过 clickhouse 存轨迹,存了 6000w 吧,用 10 个左右条件去查结果 30w 量级的数据,秒出,就是要自己想想怎么合并请求入库,官方推荐每秒最多 100 次 insert 操作
bk201
2023-07-31 17:31:58 +08:00
1.本地存储临时文件,定时上传,失败重试
2.服务端异步消息,或者直接 mongodb 都行
只要本地不丢失,都没问题。
guxin0123
2023-07-31 17:36:40 +08:00
@Allenxup 尽量保存原始记录,不要跟百度绑死了,api 计费规则修改为按次计费也不是不可能。

而且不管是 Android iOS 还是浏览器端都支持 WGS84 坐标绘制的,保存 BD09LL 或 GCJ02 完全没有意义
Elilili
2023-07-31 17:37:48 +08:00
geomesa
victorc
2023-07-31 17:45:09 +08:00
当然用 mysql 存:用 kafka 收数据,用 mysql 落盘

你们这个公司规模很小吧,要尽可能的降低技术维护成本, 统一存储。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/961002

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX