系统后台多线程处理系统数据处理机制详解

消息接收的流程图

消息处理的流程如下所示。

Created with Raphaël 2.2.0 主服务开始 1.线程数控制 2.消息派发 3.处理后消息收集 4.消息记录 5.定时更新 6.设备信息保存 7.设备自主更新 8.消息处理 9.休眠 中止循环 主服务结束 yes no

1.线程管理

消息处理是由多线程完成,以加快消息的处理。但是线程的数量如果是固定的,那么可能无法满足实际的需求。如果数量太多,又会占用额外的CPU资源。所以这里采用动态处理线程数的方式来实现。
负载:低

2.消息派发

将收到的消息派发至并发的消息处理类。
注:由于消息需要调用外部接口,可能会卡一定时间,每个消息的处理时间大约40ms - 80ms。
负载:低

3.处理后消息收集

从并发处理类读取已处理的数据。
负载:低

4.消息记录

如果是调试模式,则记录所有数据。
负载:这个比较耗时的操作,但具体负载量有待定量分析。

5.定时更新

根据收到的消息内容,逐条更新设备的信息,重点两项内容:

  • 更新消息坐标信息
    将更新后的坐标信息发送至坐标信息中。
  • 收集报警消息
    如果是报警信息(DW31/DW51移动报警,DW33/DW53 断电报警)
    负载:低。每台设备只有几个简单的操作,即可10万台也在几十毫秒即可完成。

6.设备信息保存

根据指定的保存周期,将所有的设备信息保存至指定虚拟盘中。
负载:低。目前,每台的数据量约为0.2KB,每分钟存储一次。设10万台在线,则总数据大小为20MB。由于保存的位置为内存虚拟盘,速度可以达到 1000M/s,所以20M的数据可以保存在0.1s 内完成,相对于1分钟的时间,数据量可以忽略。

7.设备自主更新

设备中有历史位置信息,进行更新和保存。
负载:低。每台数据量一般不超过10KB,但是保存的频率很低,约10-20分钟保存一次,可以忽略。

8.报警消息保存

将报警消息保存至指定的虚拟中。
负载:低。由于报警消息量很低,可以忽略。

9.休眠

休眠一段时间,以减少CPU占用率。
负载:1000 ms。

日志记录

在本程序中,由于消息的量可能会很大,所以进行以下分类。

消息类型

等级 分类 重要级别 作用
1 ALERT A 需要立刻修改的信息
2 CRITICAL A 严重级别,阻止整个系统或者整个软件不能正常工作的信息
3 ERROR A 阻止某个功能或者模块不能正常工作的信息
4 WARNING B 最具有重要性的普通条件的信息
5 NOTICE B 一般信息的日志,最常用
6 INFO B 一般信息的日志,最常用
7 DEBUG C 仅用于测试测试模。

重要级别
根据消息的重要级别,消息分为三类

  • A:导致系统无法正常运行的错误。
  • B:不影响系统正常运行,但是可用于数据分析的消息。
  • C:仅在调度模式下会记录。由于这些消息的量会很大,记录会明显影响系统性能。
  1. Emonerous (E) 消息数据量大无法实际记录;
  2. Normal (N) 消息量对性能影响在1%以内,可以正常记录;
  3. Uncertain (U) 消息量不稳定,可能会能性能产生严重影响。

附录

系统可能的坑

  1. 每条消息没有结束标记,导致会有0.5秒的延时
  2. 调用GPS API函数以实现WIFI定位的费用需要自负,可以通过本地保存的方式减少设备的调用,但是这个需要额外的开发量;
  3. 由于国家政策问题,坐标系有个随机属于会造成一定的偏差;
  4. 由于设备、网络、系统设计等多方面原因,报警接收时间会有1分钟-2分钟的延时。

猜你喜欢

转载自blog.csdn.net/weixin_43145361/article/details/84481102
今日推荐