首页 新闻 会员 周边

C#实时处理海量GPS定位信息的难题

0
悬赏园豆:100 [已解决问题] 解决于 2012-06-16 10:23

系统概述

我们用C# 3.5做了一个Windows服务用来接收从GPS服务器发送来的海量定位信息(采用事件触发,我们订阅了GPS服务器的一个事件,GPS服务器不停地推送定位信息给我们),收到信息后做如下处理:

1、解析GPS定位信息;

2、存储GPS定位信息;

3、分发GPS定位信息给订阅了该GPS终端的客户端(发送Socket包到一个通信服务器专门处理分发事宜。接收GPS定位信息的服务和订阅GPS定位信息的客户端都连接到该通信服务器)


难题

1、由于GPS终端量很大(大概2万个),每秒上报的GPS定位信息非常多,系统处理不过来;

2、保存到数据库时会出现获取不到空闲连接的问题导致保存失败(数据库为Oracle 10G)。

 

求解决方案

不知道该采用哪种方式来处理该问题。要求同时接收和处理GPS定位信息。

Jack Afa的主页 Jack Afa | 菜鸟二级 | 园豆:239
提问于:2012-03-18 18:45
< >
分享
最佳答案
0

采用分布式+多线程的方案,具体就是一个公共消息队列,用于保存GPS信号,开多个解析服务,每个解析服务再开多个线程,解析完成之后直接返回给GPS型号发送者,因为你持有了GPS信号发送者的socket句柄。

这样可以方便的扩展,不过一定不能让解析服务产生污染,否则处理起来很麻烦,谨记单一处理原则。

收获园豆:100
az235 | 大侠五级 |园豆:8483 | 2012-03-19 08:14

问题已经更新,请再看看。

您说的好复杂,领会不到。

Jack Afa | 园豆:239 (菜鸟二级) | 2012-03-19 10:48
其他回答(9)
0

这个要用队列。

水晶途途 | 园豆:1443 (小虾三级) | 2012-03-18 18:58

具体该怎么做?

数据量非常大。我怕接收的时候把队列锁住不放,那就不能处理了。

支持(0) 反对(0) Jack Afa | 园豆:239 (菜鸟二级) | 2012-03-18 19:00
0

是消息处理 MSMQ。嗯。很对。要多个线程处理消息队列。可以参考 微软的petshop4.0的订单处理。

無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-18 19:56

我们接收GPS服务器发送过来的定位信息是通过事件触发的。

我们订阅了一个事件,GPS服务器不停地推送定位信息给我们。

您的意思是?没有用过MSMQ,不理解您的意思。

支持(0) 反对(0) Jack Afa | 园豆:239 (菜鸟二级) | 2012-03-18 21:21

@Jack Afa: 你 在网络上搜索一下。很多这方面的介绍。

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-19 09:27

@無限遐想: 其实,我给你说一个思路,不管你用什么方法接受数据。主要是你处理怕跟不上 。因此,你 接到数据后,直接给了消息队列。消息队列可以开N个,你可以随机给。然后对于每一个消息队列,可以用N个线程进行数据分析。得出结果,再处理。

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-20 09:45
0

GPS信号--保存-->队列--线程解析-->定位信息--保存-->队列---线程分发-->订阅者

magic_evan | 园豆:206 (菜鸟二级) | 2012-03-18 22:42

您做过这方面的项目吗?能否详细说说?

支持(0) 反对(0) Jack Afa | 园豆:239 (菜鸟二级) | 2012-03-19 10:51
0

哈哈。我处理过这个项目,打眼一看还以为是自己提出的问题呢。

使用C#做服务,估计很悬。至少需要使用一些特殊方法。比如,完成端口等。

带宽:至少百兆。

如果采用tcp连接,常连接的话,一个接收点无法处理如此多的终端连接。

毫无疑问,接收这里简单设计,至少需要多线程。接收一个线程,数据处理再起N个线程。

数据存储,如果采用关系数据库,最终是支撑不下去的。

方案:

分布式、vc++数据服务、redis、mongodb。

不能使用普通PC作为服务器。系统最好是64位的,否则数据库有容量限制,需要多库处理。

redis存储最新数据,方便用户查询车辆及时位置以及移动信息。

mongodb存储的是历史数据。

如果项目资金不够的话,车辆最新位置信息切记不能从数据库中读取!做一个socket,从socket中获取。

祝你好运。

lucika.zh | 园豆:62 (初学一级) | 2012-03-19 09:25

高手啊!望尘莫及。。。

说得太复杂了,相当有难度。

支持(0) 反对(0) Jack Afa | 园豆:239 (菜鸟二级) | 2012-03-19 10:51

车辆最新位置信息切记不能从数据库中读取!做一个socket,从socket中获取。

我也遇到这个问题。接收车辆GPS信息的服务端有公网IP,客户端没有公网IP,而且什么时候连接服务器是不确定的,这样车辆的位置信息不能及时被客户端获取,说白了,就是怎样保证服务端获取GPS信息后马上能将GPS信息告知客户端。我的做法是将GPS服务端获取信息后保存到数据库,客户端查表里面最近时间的GPS信息,这样不及时。

支持(0) 反对(0) 霜天雪舞 | 园豆:214 (菜鸟二级) | 2012-03-19 11:31

@杨盛超: 我们的情况与你们的有点不一样。

接收GPS上报信息的是一个专门的服务器(不是我们公司的),他们收到GPS信息后不保存,直接推送给我们的Windows服务。我们这边收到GPS定位信息后,就要做解析、存储和分发的工作。我们分发到别的公司做的系统。所以说这里边牵扯到多个公司、多个系统。

支持(0) 反对(0) Jack Afa | 园豆:239 (菜鸟二级) | 2012-03-19 12:43

@Jack Afa: 地图终端使用的什么地图?google、51ditu,baidu?怎么处理的火星坐标?

支持(0) 反对(0) lucika.zh | 园豆:62 (初学一级) | 2012-03-19 21:13

@lucika.zh: 手持终端不使用地图。车载终端不知道。

支持(0) 反对(0) Jack Afa | 园豆:239 (菜鸟二级) | 2012-03-20 11:16
0

怎么发现LZ做的项目和我现在做的项目惊人的相似.

霜天雪舞 | 园豆:214 (菜鸟二级) | 2012-03-19 09:35

您做的是哪种类型的项目?是不是与EADS相关?

支持(0) 反对(0) Jack Afa | 园豆:239 (菜鸟二级) | 2012-03-19 10:50

@Jack Afa: 定位系统

支持(0) 反对(0) 霜天雪舞 | 园豆:214 (菜鸟二级) | 2012-03-19 11:22

@杨盛超: 你们那个系统做得怎么样了?性能如何?多大规模?

支持(0) 反对(0) Jack Afa | 园豆:239 (菜鸟二级) | 2012-03-19 12:47

@Jack Afa: 刚开始做,整个一套系统我们公司自己做,目前测试的GPS终端还不多,真正投入应用估计有上万个GPS终端吧。项目规模没你的大。

支持(0) 反对(0) 霜天雪舞 | 园豆:214 (菜鸟二级) | 2012-03-19 13:26
0

http://221.179.40.18:10000/

请参考这个系统(如需进入演示,请联系分配一个测试账号),刚刚完成主要功能部分。

我的方案是:

分布式(利用Memcache)、c# tcp Udp 多线程、SQL Server 2005

监控中心(接受和处理GPS数据)是由 window service 开启tcp和Udp,同事宿主wcf,wcf 服务提供接口给WebGIS 获取最近轨迹信息,同时WebGIS可直接通知WCF提供的接口向GPS设备发指令。GPS的最近记录数据利用Memcache进行分布式缓存。

我的qq : 43569879 

可加我共同研究探讨。

圆源月亮不哭 | 园豆:207 (菜鸟二级) | 2012-03-19 16:12
0

很多公司都多自己的是好几万。我们当时也是至少支持。几千。测试时500并发没有问题。但实际用时。我们现在四个上线的系统。最多也就几百个用户。

秋色 | 园豆:47 (初学一级) | 2012-03-19 16:57

不明白您的意思?

支持(0) 反对(0) Jack Afa | 园豆:239 (菜鸟二级) | 2012-03-19 17:39
0

等待高手讲解。

tb1over | 园豆:206 (菜鸟二级) | 2012-03-20 09:36
0

听一听  正好对这块感兴趣

朱博@连云港 | 园豆:102 (初学一级) | 2012-06-11 15:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册