系统概述
我们用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定位信息。
采用分布式+多线程的方案,具体就是一个公共消息队列,用于保存GPS信号,开多个解析服务,每个解析服务再开多个线程,解析完成之后直接返回给GPS型号发送者,因为你持有了GPS信号发送者的socket句柄。
这样可以方便的扩展,不过一定不能让解析服务产生污染,否则处理起来很麻烦,谨记单一处理原则。
问题已经更新,请再看看。
您说的好复杂,领会不到。
这个要用队列。
具体该怎么做?
数据量非常大。我怕接收的时候把队列锁住不放,那就不能处理了。
是消息处理 MSMQ。嗯。很对。要多个线程处理消息队列。可以参考 微软的petshop4.0的订单处理。
我们接收GPS服务器发送过来的定位信息是通过事件触发的。
我们订阅了一个事件,GPS服务器不停地推送定位信息给我们。
您的意思是?没有用过MSMQ,不理解您的意思。
@Jack Afa: 你 在网络上搜索一下。很多这方面的介绍。
@無限遐想: 其实,我给你说一个思路,不管你用什么方法接受数据。主要是你处理怕跟不上 。因此,你 接到数据后,直接给了消息队列。消息队列可以开N个,你可以随机给。然后对于每一个消息队列,可以用N个线程进行数据分析。得出结果,再处理。
GPS信号--保存-->队列--线程解析-->定位信息--保存-->队列---线程分发-->订阅者
您做过这方面的项目吗?能否详细说说?
哈哈。我处理过这个项目,打眼一看还以为是自己提出的问题呢。
使用C#做服务,估计很悬。至少需要使用一些特殊方法。比如,完成端口等。
带宽:至少百兆。
如果采用tcp连接,常连接的话,一个接收点无法处理如此多的终端连接。
毫无疑问,接收这里简单设计,至少需要多线程。接收一个线程,数据处理再起N个线程。
数据存储,如果采用关系数据库,最终是支撑不下去的。
方案:
分布式、vc++数据服务、redis、mongodb。
不能使用普通PC作为服务器。系统最好是64位的,否则数据库有容量限制,需要多库处理。
redis存储最新数据,方便用户查询车辆及时位置以及移动信息。
mongodb存储的是历史数据。
如果项目资金不够的话,车辆最新位置信息切记不能从数据库中读取!做一个socket,从socket中获取。
祝你好运。
高手啊!望尘莫及。。。
说得太复杂了,相当有难度。
车辆最新位置信息切记不能从数据库中读取!做一个socket,从socket中获取。
我也遇到这个问题。接收车辆GPS信息的服务端有公网IP,客户端没有公网IP,而且什么时候连接服务器是不确定的,这样车辆的位置信息不能及时被客户端获取,说白了,就是怎样保证服务端获取GPS信息后马上能将GPS信息告知客户端。我的做法是将GPS服务端获取信息后保存到数据库,客户端查表里面最近时间的GPS信息,这样不及时。
@杨盛超: 我们的情况与你们的有点不一样。
接收GPS上报信息的是一个专门的服务器(不是我们公司的),他们收到GPS信息后不保存,直接推送给我们的Windows服务。我们这边收到GPS定位信息后,就要做解析、存储和分发的工作。我们分发到别的公司做的系统。所以说这里边牵扯到多个公司、多个系统。
@Jack Afa: 地图终端使用的什么地图?google、51ditu,baidu?怎么处理的火星坐标?
@lucika.zh: 手持终端不使用地图。车载终端不知道。
怎么发现LZ做的项目和我现在做的项目惊人的相似.
您做的是哪种类型的项目?是不是与EADS相关?
@Jack Afa: 定位系统
@杨盛超: 你们那个系统做得怎么样了?性能如何?多大规模?
@Jack Afa: 刚开始做,整个一套系统我们公司自己做,目前测试的GPS终端还不多,真正投入应用估计有上万个GPS终端吧。项目规模没你的大。
请参考这个系统(如需进入演示,请联系分配一个测试账号),刚刚完成主要功能部分。
我的方案是:
分布式(利用Memcache)、c# tcp Udp 多线程、SQL Server 2005
监控中心(接受和处理GPS数据)是由 window service 开启tcp和Udp,同事宿主wcf,wcf 服务提供接口给WebGIS 获取最近轨迹信息,同时WebGIS可直接通知WCF提供的接口向GPS设备发指令。GPS的最近记录数据利用Memcache进行分布式缓存。
我的qq : 43569879
可加我共同研究探讨。
很多公司都多自己的是好几万。我们当时也是至少支持。几千。测试时500并发没有问题。但实际用时。我们现在四个上线的系统。最多也就几百个用户。
不明白您的意思?
等待高手讲解。
听一听 正好对这块感兴趣