基于Redis的主模型管理系统设计与实现

时间:2022-09-08 04:05:02

基于Redis的主模型管理系统设计与实现

摘要摘要:飞行器总体设计是多学科相互协作、反复迭代的动态过程,现今很多软件和系统在多专业协同以及设计过程动态表达上还有所欠缺。为此,设计并开发了一套全新的主模型管理系统,该系统实现了对设计过程中与主模型相关的数据、版本、谱系等要素的管理功能,通过版本和技术状态的变化,追踪并反馈整个设计过程中的各种动态变化。系统采用Redis内存数据库实现数据的存储,具有存储简便、效率高等优点;在复杂业务的处理上探索了使用事件的方式实现各子模块的解耦。详细探讨了系统总体设计思路和过程,同时对系统的实现进行了简要阐述,为类似系统的设计提供参考与借鉴作用。

关键词关键词:主模型;版本管理;数据谱系;Redis

DOIDOI:10.11907/rjdk.171033

中图分类号:TP319

文献标识码:A文章编号文章编号:16727800(2017)005007505

0引言

飞行器总体设计综合了总体、气动、飞行力学、推进、控制及结构等子系统专业的知识与成果,是一个按照特定程序交叉、反复迭代的过程。为了使型号的整体性能最优、成本最低、研制周期最短,总体集成化设计模式是其发展的必然趋势和迫切需求。总体集成设计对提高飞行器设计质量、降低研制成本、缩短研制周期具有重要意义[1]。

早期型号设计软件大都针对某特定的型号,采用结构化形式组织学科执行模块,以固化的数据结构表达总体方案,因而设计流程和数据接口基本固定,扩展性较差,仅适用于少量方案的参数设计和对比评估[2]。近年来,随着飞行器领域信息化的不断发展,出现了基于高拟真度模型的软件工具,如Sim SAC开发的基于物理分析的设计平台CEASIOM,以及NASA开发的高拟真度MDO设计与优化工具Open MDAO等[34]。这类软件具有一定的多学科集成、数据管理和分析优化功能,但是仍然无法表达由于多种方案设计需求引起的设计过程动态性。为此,急需建立一套完整的总体协同设计环境,具备多种方案设计和选型的能力,能够较好地反映设计过程中的动态变化,从而提高总体设计的效率和质量。

基行器总体设计智能主模型的研究成果和标准规范,结合当前飞行器总体设计过程中工具软件的使用情况及存在的不足,针对总体设计对模型及数据管理方面的需求,设计并开发了一套更加符合总体设计过程的主模型管理系统,实现了设计过程中对与主模型相关的数据、版本、谱系等进行管理的功能。该系统能够在整个设计过程中将各种动态变化及时反馈到各子系统的设计修改过程之中,为多领域、多专业的协同设计过程提供支撑。

1相关技术

1.1数据处理

协同数据区:协同数据区对应一个型号项目,内容包括型号的基本信息、项目团队、下级目录,一个数据区一般包含不同设计阶段的多主模型。

主模型:主模型对应一个型号方案,内容包括基本信息、下级目录、谱系关系、专业角色,一个主模型一般包含多个数据包。

专业数据包:专业数据包对应一套相关专业数据文件,内容包括目录、文件、所属专业。一个专业有多个数据包,数据包不允许跨专业。

数据项:数据包中的一项数据内容,是版本管理的最小粒度,一个数据项对应一个数据文件,文件类型可以是文本、图片、报告、表格等。

谱系关系:谱系关系是指专业数据包的上下游关系,其是协同设计的依据,主模型通过谱系关系驱动设计活动。一个主模型对应一套谱系关系,谱系不允许跨主模型。

1.2redis内存数据库

Redis是一种基于内存的NoSQL数据库产品,由远程字典服务(REmote DIctionary Server)取名而来。它支持多种数据类型的存储:字符串(string)、链表(list)、集合(set)、有序集合(zset)和哈希类型(hash),并且各种类型都支持丰富的操作,其中大多都支持原子操作。为了保证数据存取的效率,数据都是保存在内存中;Redis还提供了对持久化的支持,可以定期将更新的数据异步写入磁盘,同时不影响继续提供服务;此外,还可以使用集群的形式对Redis进行水平扩容,实现大规模数据存储[5]。根据Redis官方测试数据,Redis写入速率为198 412.69条/s,读速率为198 019.80条/s[6]。Redis具有如此之多的优秀特性,这使得它从一开始就受到了广泛关注,Redis可以适用于多种不同的应用场景,很多大型互联网企业的后台服务中都在使用Redis,有不少成功应用的范例。

1.3Spring与事件模型

Spring是Web开发中常用的一个开源框架,它采用分层的架构形式,使得开发者可以根据需要选择使用哪些组件。它所具备的控制反转技术促进了应用的低耦合,而面向切面的编程方式则能通过分离业务逻辑与事务从而实现内聚性开发。Spring的使用大大简化了企业应用的开发,降低了成本,因此在现今的Web开发中得到了广泛应用[7]。

Spring中的ApplicationContext提供了容器内部事件的功能,它基于观察者模式实现,当某事件触发时,所有注册了该事件的监听器将收到消息并进行事件处理。事件模型通过ApplicationEvent类和ApplicationListener接口提供编程接口。使用事件模型时,首先通过继承ApplicationEvent定义事件;然后定义事件相关的事件参数;最后通过实现ApplicationListener接口定义相关的监听器,完成后即可使用ApplicationContext中的publishEvent方法事件并进行事件的相关处理[8]。

2系统总体设计

系统与外部的交互如图2所示,主模型管理系统在整个系统中处于核心地位,它配合主模型建模工具、专业客户端等工具,为设计师提供一个基于主模型的高效协同工作环境。系统采用B/S和C/S模式相结合的形式,这样可以取长补短,充分发挥两者各自的优势[9]。服务器端采用Web应用中最流行的三层架构形式实现,使用了Redis、Spring、Activiti等技术,为浏览器端、主模型建模工具和专业客户端提供数据的存储和访问等相关服务。浏览器端使用ExtJS开发,具有除数据包同步、提交功能外的系统的大部分功能,可以满足专业设计人员日常数据浏览、审批等各项需求。主模型建模工具和专业客户端均使用C/S架构的形式实现,主模型建模工具负责主模型结构的设计和主模型的导入;专业客户端主要负责主模型的访问和数据包的同步,两者均通过WebService接口与系统交互。

主模型管理系统模块设计图如图3所示,包括七大功能模块:①数据区管理:提供对协同数据区的管理和控制功能;②版本管理:提供基础文件、目录的存储和版本管理功能;③主模型管理:提供针对主模型、数据包和谱系的管理功能;④数据谱系管理:提供谱系追踪、技术状态变更通知和一致性检查等功能;⑤数据应用:提供基本的数据查询、浏览和统计功能;⑥系统管理:提供基本的用户、权限、日志、浞荨⒒指吹裙δ埽虎呖放式数据接口:基于WebService接口提供对数据区和主模型数据的访问功能。

其中,版本管理和数据谱系管理是系统中最重要也是最复杂的两个功能模块,故下面的章节将详细介绍这两个功能的设计。

3版本管理模块设计

版本控制是系统的关键功能,为了满足主模型版本管理和谱系追踪的要求,参考了SVN版本控制的概念和原理,实现了版本信息的存储和记录、本地数据与远程数据的同步、历史版本的追溯等功能[1011]。

在设计版本管理模块时,通过抽象的节点建立数据之间的逻辑结构,并基于节点实现通用的版本控制功能,节点可以关联目录和文件。在主模型模式下,还可以扩展为数据区、主模型、数据包、数据项。即使主模型的结构发生变化,通过抽象的节点也能够灵活适应。

数据库结构设计是Web开发中的重要环节,数据库结构设计的好坏会直接影响到后续设计和开发工作。因为系统中存在较多树状和图状结构,如版本控制中的目录结构、数据谱系中的谱系结构;对于这些结构的存储,如果采用传统的关系型数据库按行存储,并使用外键的方式形式表示结构中的前驱和后继关系,那么在整个结构展现时就需要对结构进行递归遍历,从而导致过多的数据库查询操作,而传统关系型数据库的查询效率普遍较低,因此会拖慢系统的整体响应速度,影响用户体验[12]。因此,采用当下比较流行的NoSQL数据库――Redis进行应用数据的存储,它不仅可以实现对数据的快速存取操作,而且比关系型数据库更加适合树状和图状结构数据的存储。

在版本管理相关的库结构设计中,采用键值对的形式将数据保存在Redis中,主要结构及描述如表1所示,为了简单起见,表中属性只保留与版本相关部分,其它与业务相关的属性不再列出。

基于以上的库结构设计,抽象出一个节点类Node,它包含id、name、version、type、children等基本属性,文件夹、文件、数据区、主模型、数据包等类型则继承Node类,其他属性可以根据需要进行扩展。为了简化Redis中的存储、读取和转换等操作,引入了Spring Data Redis实现对Redis中的JSON数据和Java Bean之间的序列化和反序列化[13]。

版本库的基本操作有提交、合并、回滚等,这些操作的逻辑均较复杂,若采用通常使用的基于方法调用的形式实现这些基本操作,则势必使得各子方法间耦合性较强,因此采用基于Spring事件模型的方式实现这些基本操作。本文以提交操作为例,简单介绍如何使用事件模型的形式实现版本提交功能。

提交操作包括文件夹、文件、数据区、主模型、数据包等多种类型的新增、修改、删除的混合操作,因此提交操作中相关事件监听器按照初始化、节点变更、扩展类型操作、保存操作历史、事件后处理这5种类型进行组织。

(1)初始化:对事件初始化参数进行配置,包括版本号生成,新增节点ID分配以及节点增删改的具体配置;

(2)节点变更:对通用节点类型进行变更操作,包括总体结构变更,节点增删改的处理,父节点版本提升等操作;

(3)扩展类型操作:对增删改具体类型的操作,包括新版本详细信息的创建与属性设置,比如对文件来说,需要保存文件的实际路径和计算文件的MD5值;

(4)保存操作历史:保存用户本次提交操作的详细信息,包括备注和本次有改变的节点信息;

(5)事件后处理:提交操作完成之后的后处理,包括消息的发送,送审等操作。

以上5种类型的监听器可以根据需要分解成更为具体的监听器,以进一步细化各步操作。

4数据谱系管理模块设计

数据谱系定义了数据包间的依赖关系,在飞行器总体设计过程中,各专业间的协作关系可以通过该专业数据包与其它专业数据包间的数据依赖关系所确定;因为依赖关系中不可能出现循环依赖,所以数据谱系的关系实际上就是一个有向无环图模型;根据专业协作关系,当一个专业数据包所依赖的上游数据包工作全部完成时,它才可以开展它自身的工作。因此可以通过数据流的状态反映协同工作的完成情况,并以此为基础实现谱系的追踪和技术状态的变更。

为了表示设计过程中数据包节点的工作状态,定义了最新、待更新、已过时3种技术状态,它们依次表示工作完成、工作进行中和工作未开始这3种工作状态;依据这3种技术状态,可以对设计的总体过程进行追踪。技术状态的更新由系统根据谱系关系和数据包的依赖关系进行技术状态分析以确定数据包的技术状态,技术状态分析规则如下:

最新:上游数据都为最新,并且当前依赖的上游版本也是最新有效的。

待更新:上游数据包都为最新,但当前依赖的上游版本不是最新有效。

已过时:上游数据包中存在已过时或待更新的数据包。

在设计数据谱系管理模块时,考虑到要能够对各数据包技术状态的变化进行追踪,因此在每次技术状态分析时需要记录当前主模型下所有数据包的技术状态;同时考虑到可能的数据谱系关系变更,需要在每次谱系关系变更时记录当前主模型的数据谱系关系。设计时,将谱系管理、技术状态分析模块从版本管理模块中独立出来,这样既减小了两相关模块间的耦合,同时也减少了技术状态分析过程中不必要的版本比较,从而减小了技术状态分析的时间复杂度。为了便于谱系的展现和技术状态的分析,采用如下的库结构设计,具体结构和描述如表2所示。

基于以上库结构设计,使用master_model_info和data_pack_info分别记录主模型谱系关系和数据包状态信息。在进行技术状态分析时,首先从master_model_info中获取对应版本主模型中数据包的谱系关系,然后获取需要分析的数据包的状态信息,按照以下规则对该数据包的技术状态进行分析:

(1)上游已完成数据包数小于入度(precursor_newest < in_degree)时,表明该数据包上游数据包不全是最新状态,故该数据包的技术状态应为已过时;

(2)上游已完成数据包数等于入度(precursor_newest = in_degree)时,表明该数据包上游数据包已全部是最新状态,此时若有:①数据包依赖的上游数据包不全是最新的,表明该数据包在当前主模型中没有进行提交操作,故其技术状态应为待更新;②数据包依赖的上游数据包均为最新,表明该数据包在当前主模型中进行了提交操作,故其技术状态应为最新。

(3)按上述规则对当前数据包进行分析后,若当前数据包技术状态有改变,则按如下规则对其直接下游状态信息进行变更:①当前数据包节点技术状态由其他状态变为最新,则其直接下游属性precursor_newest进行加一操作;②当前数据包节点技术状态由最新变为其他状态,则其直接下游属性precursor_newestM行减一操作。

(4)按上述规则递归地对当前数据包的下游数据包进行技术状态分析。

从上述分析规则中可以看出,在数据包状态信息中增加属性precursor_newest的意义所在。对当前数据包进行技术状态分析时,可以直接根据in_degree与precursor_newest的关系确定所有上游数据包的完成状态;而不需要对所有上游数据包进行遍历再得出所有上游数据包的完成状态。因此,该方法可以在很大程度上减少对上游节点的重复遍历,降低技术状态分析的时间复杂度。

5应用架构及分析

主模型管理系统的应用架构如图4所示,系统总体上采用三层架构的形式实现。请求控制层用来处理用户的请求,包括浏览器发出的Http请求和客户端发出的Web Service请求;业务逻辑层用来对简单业务进行处理,同时也对相关事务进行的控制;数据访问层实现对数据存储和访问,包括存储在Redis中的数据和存储在文件服务器中的文件。由于版本管理模块和数据谱系管理模块的业务逻辑都比较复杂,如果直接在业务逻辑层实现则会导致模块的耦合性较强,代码不易维护等缺点;故将这两个复杂模块分解成多个小模块,各小模块逻辑在业务逻辑层实现,再使用事件模型的方式将这些小的模块整合到一起,使得系统的耦合性有所降低。

6结语

为解决飞行器总体设计过程中多专业协同以及过程的动态性表达问题,设计并开发了一套基于Redis的主模型管理系统,系统使用简单高效的Redis内存数据库进行数据存储,并对使用事件的方式降低各子模块的耦合性进行了探索。本文对系统设计与开发过程中的关键技术进行了介绍和讨论,并分别就版本管理和数据谱系管理这两大功能模块的设计过程进行了详细介绍,为今后类似系统的设计提供参考与借鉴作用。

参考文献参考文献:

[1]孙建勋,张立强等.飞行器总体多学科集成设计平台[J].计算机集成制造系统,2012,18(1): 18.

[2]梅小宁,杨树兴.复杂系统的多学科设计优化综述[J].工程设计学报,2010,17(3): 173185.

[3]PESTER M.Multidisciplinary conceptual aircraft design using CEASIOM[D].Hamburg: Hochschule für Angewandte Wissenschaften Hamburg,2010.

[4]CHRISTOPHER M, HEATH,JUSTIN S GRAY.OpenMDAO: framework for flexible multidisciplinary design,analysis and optimization methods[C].Reston,Va.,USA: AIAA,2012.

[5]Redis[EB/OL].http://redis.io.

[6]How fast is Redis[EB/OL].http://redis.io/topics/benchmarks.

[7]翟剑锟.Spring框架技术分析及应用研究[D].北京: 中国科学院大学,2013.

[8]Spring framework reference documentation[EB/OL].http://docs.spring.io/spring/docs/4.3.6.BUILDSNAPSHOT/springframeworkreference/htmlsingle.

[9]孙达凯,鲍劲松.大型企业中B/S构架和C/S构架平台的研究[J].科学家,2015(11):3339.

[10]Apache Subversion[EB/OL].http://.

[11]侯秋菊.开源软件SVN库中提交行为的特性研究[D].武汉:武汉科技大学,2015.

[12]权治,宋晶晶.基于NoSQL的数据库技术分析[J].无线电工程,2013,43(9): 427.

[13]Spring data redis[EB/OL].http://projects.spring.io/springdataredis.

上一篇:Spark 2.0平台在大数据处理中的应用研究 下一篇:让我们慢慢老去