地震应急消息系统的设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1概述
中国是地震频发国家,地震应急工作是防震减灾的重中之重。

因此,我国在“九五”期间,研发地震应急快速响应系统、城市防震减灾信息管理与辅助决策系统等,“十五”期间研发地震应急指挥技术系统等,旨在为全国抗震救灾提供决策辅助[1]。

但随着互联网的兴起,技术的更新换代以及日新月异的需求变化,地震应急业务的调整等因素,不同的团体开始研发子系统供内部评估,例如云南省地震局使用的地震应急指挥技术系统包括评估软件4个,信息服务软件3个,市县协同平台1个等[2]。

在团队内部针对不同的地震应急业务研发子系统,为应急决策提供更多的决策服务,而不仅仅依赖已有的地震应急业务系统,以这种方式提高各个机构的地震应急能力。

国家台网中心机构内部为研究不同地震灾害评估模型的评估精度,实现队伍的专业分工,针对不同灾害评估方向攻克难点,选取当前主流的技术研发内部评估模块,由这些评估模块构成一个实验平台(地震应急灾害评估系统),用来验证各模型的精度,提高运算速率。

借助独立开发部署的方式将大型软件进行功能解耦,为地震应急决策提供多种选择。

目前,团队已初步建成一个地震应急灾害评估系统,包含地震消息接入模块、人口伤亡评估模块、地震烈度评估等模块等;这些模块独立部署,共同承担震后的灾害评估工作。

然而,各个模块间的协作存在问题,包括消息之间的传递不可见,历史消息不可查,各个模块间的功能测试机制不完整等。

因此,团队内部研发一个地震应急消息系统,管理地震应急灾害评估系统中各模块的消息交互,为地震应急评估各模块的正常工作提供保障。

2技术思路
地震应急消息系统采用B/S架构,采用RabbitMQ 的消息发布/订阅模式,设计一个标准消息体,结合MySQL、百度地图API,构建Django的轻量级网站,实现一个集监控、查询、测试和空间可视化于一体的地震应急消息系统。

2.1消息中间件
消息中间件一般用来实现可靠的数据传送,实现不同的对象之间的消息传递、事件激活,以及不同平台系统间的消息通信。

消息中间件能兼容平台间的特性,满足地震应急灾害评估系统各模块协同工作的应用场景。

地震应急消息系统中监控的消息包括:真实地震消息、测试地震消息、人口伤亡评估消息、地震烈度评估消息,这些消息具有如下特点:
(1)不确定性。

无法提前预知地震的具体参数。

(2)强时效性。

地震灾害评估需保证评估产出的时效性。

(3)消息间存在依赖。

地震烈度评估消息、人口伤亡评估消息依赖于地震消息。

(4)消息总量不大,可靠性要求高。

消息的数量由地震的频率决定,所以,消息总量不大。

各模块间的协同工作依赖于消息的传递,必须保证消息传递到各个模块,需要消息确认机制。

基金项目:中国地震台网中心青年科技基金,基于Python实现地震影响场自动生成和动态修正方法研究(项目编号:QNJJ201909)。

作者简介:谭专条(1992-),女,硕士,助理工程师,研究方向:地震应急领域软件研发、数据分析。

地震应急消息系统的设计与实现
谭专条,徐志双,任静,陈雅慧
(中国地震台网中心,北京100045)
摘要:地震应急灾害评估系统中,各模块独立部署,以消息通信,存在消息消费状态不可见、历史消息不可查、功能不可测等问题。

基于RabbitMQ的消息发布/订阅模式,以Django为架构,结合百度地图API,搭建一个B/S架构的地震应急消息系统。

用于记录、监控、可视化各个地震应急评估模块的消息,为地震应急灾情评估工作提供保障。

关键词:消息中间件;地震应急;Django;百度地图API
目前主流的消息中间件有Kafka、RabbitMQ和Re⁃dis等。

Kafka适用于高吞吐量的事件处理或日志收集,对消息重复或者丢失没有严格的要求,不符合地震应急消息系统的确认机制需求。

Redis是一种基于内存的数据库,可用于消息推送,但Redis不保证可靠性。

Rab⁃bitMQ支持多种协议(AMQP、XMPP、SMTP等),支持多种主流开发语言(Java、Python、Go等),企业中有诸多以RabbitMQ作为消息中间件的成功案例。

Rabbit MQ有消息确认机制,包括生产者确认与消费者确认[3],满足系统对消息的可靠性要求,因而选取RabbitMQ作为系统的消息中间件。

系统采用RabbitMQ的发布/订阅模式,消息由RabbitMQ分发,各模块订阅地震应急消息队列。

绑定到exchange下的地震应急消息队列的消费者,即可接收到消息,各模块在获取消息后异步执行工作,实现了模块间的解耦。

采用发布/订阅模式,方便后续系统的升级和功能扩展。

2.2消息体
地震消息作为各评估模块订阅的对象,需将地震消息序列化以实现网络传输。

消息封装的数据类型包含字符串类型、浮点型、日期格式等。

消息体采用json格式,因为相比XML及FSV等格式,json更灵活,是支持多种开发语言的轻量级数据交换格式。

json能存储对象、数组、字符串等,传输速率更快[4]。

在地震应急消息系统中,json格式的消息能在各个模块以及不同开发语言中传递与消费。

消息体为固定键值对的json对象,样例:{"mes⁃sage_type":test_message,"message_content":{"Event_ id":20190525120000.00,"id":'CD20190525141938',"lat": 23.85,"lon":102.02,"location":"云南省云江县","save_ time":20190525120000,"magnitude":7.3,"depth": 10.0,"Explosion_flag":''''}}。

其中,lat和lon代表震中的经纬度,magnitude代表震级,depth代表震源深度, message_type代表消息类型,用来区分不同模块发送的消息。

目前消息类型有4类:人口伤亡评估消息loss_assessment_message、地震烈度评估消息intensi⁃ty_message、真实地震消息eqim_message、测试地震消息test_message。

历史消息持久化存储至MySQL,数据库表的字段对应消息中的键值对,添加isSuc字段描述消息的生产、接收状态及计算结果是否正常,以此解决各模块消息的消费状态不可见、历史记录不可查的问题。

2.3总体设计
地震应急消息系统基于Django框架实现,采用MTV模式;即模型(Model)、模板(Template)和视图(Views)[5]。

其中模型(Model),即数据存取层,用于存取系统中的消息、执行数据库相关操作,实现系统与MySQL数据库的数据交互;模板(Template),即表现层,用于页面布局、渲染、地图展示、数据查询等前端数据的可视化;视图(Views),即业务逻辑层,用作模型与模板之间的桥梁,响应模型和模板调用的后台逻辑,实现消息接收、存储、查询等,消息状态判断等逻辑处理。

地震应急灾害评估系统的总体架构如图1所示,地震应急消息系统、地震消息接入模块、地震烈度评估模块和人口伤亡评估模块独立开发、部署的子系统,通过RabbitMQ进行消息通信。

地震应急消息系统发送测试消息或地震消息接入模块向RabbitMQ发送地震消息,人口伤亡评估模块和地震烈度评估模块订阅地震应急消息队列,异步执行评估产出,评估完成后发送反馈消息。

地震应急消息系统接收并存储各模块的反馈消息到MySQL。

用户可请求发送测试、检索历史消息和地图在线浏览等操作,通过地震应急消息系统掌控各模块的运行情况。

3功能实现与应用
地震应急消息系统的功能分为模块:用户验证模块、消息测试模块、消息查询模块、程序监控模块以及地图展示模块。

系统实现对地震应急灾害评估系统中关于消息的监控、记录和操作等,保证程序的可靠性,解
图1总体架构图
用户请求
地震应急消息系统
Template
Model
Views
地震消息接入模块
消息中间件RabbitMQ
MySQL地震烈度评估模块
人口伤亡评估模块
决地震应急各个模块的协同工作缺乏全局监控的问题。

3.1用户验证
用户验证模块是出于对安全性的考虑,记录人员的
操作历史。

基于Django 的权限管理模块,使用auth 类,实现用户注册、登录验证、密码修改、注销等功能。

其中,auth.login()实现登录,auth.authenticate()实现验证等。

在页面请求函数添加装饰器@login_required(),校验用户的登录状态。

3.2地图展示
地震消息具有空间信息、属性信息,地图展示模块
以将历史地震与关联的评估历史消息直观地展示在地图上,符合用户界面友好的需求。

模块集成了百度地图服务,百度地图API 提供了丰富的控件、事件和函数,提供在线地图标注服务。

单击历史地震点弹出气泡窗口,查看属性信息(发震时间、地点、震级,是否成功触发人口伤亡评估模块、地震烈度评估模块,若有反馈消息则显示已收到)。

加载所有的历史地震,则连接数据库设置检索条件,建立点集传递到前端渲染,缩放地图可浏览历史地震在地图上的分布。

单个最新历史地震渲染的实现步骤如下:
(1)加载百度在线地图服务,获取地图渲染的数
据。

添加百度地图引用,以调用百度的API。

在Views 文件中定义前端的逻辑函数,获取最新地震,lasteq =models.rmqmsg.objects.filter (message_type='eqim_messa ge').last ();查询数据库中是否存在该地震事件对应的各模块的反馈消息Ieq=models.rmqmsg.objects.filter (Event_id =lasteq.Event_id).filter (message_type="intensity_mes⁃
sage");Leq=models.rmqmsg.objects.filter (Event_id=lasteq.Event_id).filter (message_type ="loss_assessment_mes⁃sage")。

经纬度封装在该地震点的对象中,其余属性数
据则赋值给字符串strdata =str (str (lasteq.save_time)+""+str (lasteq.location)+str (lasteq.magnitude)+"级地震;"),结果以字典返回给前端渲染。

(2)前端获取响应函数返回的数据,渲染到地图
上。

在JavaScript 中加载地图var map =new BMap.Map ("container");获取最新的历史地震点var last_data ={{Last_data |safe}};解析对象获取经纬度并定义点lastearthquake =new BMap.Point ({{lastearthquake.lon }},{{t }});定义地图显示范围map.cen⁃
terAndZoom (lastearthquake,10);按照地图点坐标生成标
记eqmarker=new BMap.Marker (lastearthquake);定义气泡弹窗事件eqmarker.addEventListener ('click',function(){this.openInfoWindow (new Window (last_data [0]));});map.addOverlay (eqmarker);再添加缩放、导航功能等。

3.3消息测试
消息测试模块提供一个测试机制,一种为自定义的
测试消息,测试各个评估模块是否正常工作;另一种是以附件的方式实现批量测试,对各个评估模块的模型精度进行评估。

实现步骤:(1)导入json、pika 模块。

Json 模块封装数据、pi⁃ka 模块执行与RabbitMQ 的操作。

(2)封装消息。

根据需求修改页面上的测试地震消
息的参数,系统根据时间自动生成固定位数的Event_id、id,提交表单,调用json.dumps()函数将地震参数的列表进行json 格式的编码。

批量测试则后台封装附件中的消息到json 中。

(3)发送消息。

调用pika.BlockingConnection 建立
程序与RabbitMQ 的连接,channel.exchange_declare()声明exchange 定义消息发布订阅工作模式,调用channel.basic_publish()发送消息。

(4)页面展示消息发送状态。

RabbitMQ 的接收消息后会返回一个布尔值,代表接收是否成功。

3.4消息查询
消息查询模块实现近期的地震消息的展示。

历史数
据存储在MySQL 中,系统的数据库操作基于Django 的ORM 对象关系映射,实现地震消息的持久化存储和前后端的数据交互。

定义一个Model 类(rmqmsg)代表订阅的RabbitMQ 消息,一个消息对应rmqmsg 类的一个对象,一个对象对应数据库表的一条记录,rmqmsg 类的属性对应数据库中的表字段和消息体中需要解析的键值对,实现消息体、对象和数据表的映射。

最后,结合JavaScript 和Django 的前端模板Template 展示查询结果。

3.5程序监控
程序监控模块从可靠性方面考虑,设计一种监控机
制,以维护地震应急消息系统的正常运行。

系统采用两种方式进行监控,(1)异常捕获机制,
(2)系统运行
日志。

地震应急消息系统需要24小时运行,程序的可靠性要求高。

用于接收RabbitMQ 的消息的线程mes⁃
的基本数据,如View Name 、Current Name 等。

而成员函数又包含了Get Cate Gory()、Get Over View()、Get De⁃tail Data()等,都可以结合不同的需求制定模型数据,形成企业门户系统页面风格统一性所必须的元素,然后传递给视图层,提高系统的可维护性。

3.2控制层
控制层通过继承Basic Controller 类,调用基类中的
Post View Date()方法向视图层提交数据,Post View Date()的返回值为Action Result 类型。

Add News Type()根据页面层级的不同加载不同的数据,向用户提供针对
性的信息;Load View Data()参数为IRender Prd Level Data 类型的数据,这些数据将通过键值对的方式传递到视图层;Add More View Data()并无实际提交数据,用于以备今后程序的扩展升级。

Post View Data()函数是Basic Controller 类的成员函数,控制层的各个控制器继承这个类,在Action 调用的最后通过调用基类中Post View Data()函数来向视图层提交数据。

除了IRender Prd Level Data 类型的参数外,Post View Data()还可以选择传递一个Object 类型的对象,这个重载方法丰富了页面的数据,并且在传递给页面数据的类型上具有足够的灵活性。

Post View Date()中Load View Date()函数接受IRender Prd Level Data 类型的参数,是实际传递页面数据对象的函数。

传递页面数据可以分为两部分,一部
分用于构建页面的主要信息,一部分用于构建导航信息如Category 导航控件、层次路径导航。

3.3视图层
MVC 视图层的层次包含了视图页面、用户控件和
模板页。

通过用户控件的模块化形成类似Wed Form 中的控件效果,由此来提升代码的使用率,形成统一和谐的页面风格。

借助CSS 样式、Java Script 脚本等技术,从而优化交互界面,提升用户的满意程度。

4结语
基于MVC 架构,结合企业实际发展需求,通过整
体设计和细节设计,对前端、后台进行了布局,形成了功能极大的企业门户网站,不仅能够很好地推动企业的信息化发展,还能够保证企业门户系统的安全性。

参考文献
[1]尉建龙,郭志刚,贡力.基于MVC 架构的国家重点
实验室门户网站的设计与实现[J].机械工程与自动化,2018,(02):108-109.
[2]宋南.基于MVC 架构的企业宣传门户平台的开发
与设计[D].吉林大学,2014.
[3]孙红亮,解建军,王新.基于MVC 架构的校园门户
网站设计与实现[J].电脑开发与应用,2014,27
(04):20-22.
[4]梁远.基于MVC 的客户信息管理系统的设计与实
现[J].电脑知识与技术,2016,12(20):89-91.
sage_thread 存活,则可正常接收和记录消息。

系统采用异常捕获机制,一旦连接地震应急消息队列的线程发生异常退出时,程序捕获异常并新建消息线程,系统日志,记录系统的日常操作和异常错误,为后期系统维护提供帮助。

4结语
地震应急消息系统是一个以Django 为架构的轻量
级企业内部网站,通过规范的消息体,设计消息测试机制、检索机制、可视化机制和程序监控机制,供内部人员测试、查询、监控系统中消息的交互情况。

系统的实现解决了地震应急灾害评估系统中不同模块间协作面临的历史消息不可见、不可查、不可测等问题;使地震应急灾害评估系统中的各个模块实现一定程度上的可控、可查,为地震应急灾后评估工作提供了保障,具有意义。

参考文献
[1]帅向华,姜立新,王栋梁.国家地震应急指挥软件
系统研究[J].自然灾害学报,2009,18(03):
99-104.
[2]李兆隆,吕佳丽,郑川,等.云环境下的云南地震
应急指挥技术软件系统设计与实现[J].地震研究,
2019,42(02):196-203.
[3]徐震,焦文彬.RabbitMQ 小消息确认机制优化[J].
计算机系统应用,2018,27(3):252-257.[4]高静,段会川.JSON 数据传输效率研究[J].计算机工程与设计,2011,32(7):2267-2270.
[5]张翠丽,孟小艳,杨抒.基于Django 框架的管理系
统的设计与开发[J].计算机技术与发展,2019,
29(10):63-68.
(上接第9页
)。

相关文档
最新文档