水文模型的服务化封装方法研究与应用

2022-07-27 05:58余宇峰胡健伟朱跃龙万定生张锦堂
关键词:服务化调用水文

余宇峰,胡健伟,严 琳,朱跃龙,万定生,姚 成,张锦堂

(1.河海大学计算机与信息学院,江苏 南京 210098; 2.水利部信息中心,北京 100053;3.锐捷网络(苏州)有限公司,江苏 苏州 350002; 4.安徽省水文局,安徽 合肥 230022 )

水文模型作为水文过程的模拟手段,在洪水预报、工程设计及水文机理研究中起着十分重要的作用[1]。经过多年的研究,国内外水文学家、气象学家、生态学家分别从不同视角在不同学科领域构建了大量不同复杂程度的水文模型[2-10],如黑箱模型、概念模型和分布式水文模型等。随着人们对高质量的水文数据以及优秀水文模型的需求日益增加,如何应用组合式水文模型[11]的理念,将具有独立、异构、封闭特征的水文模型资源按一定标准拆分、封装为服务,并通过特定的建模框架或接口标准,灵活地将服务组合并共享为能应用于不同场景的系统,从而提升水文模型的共享能力,为水文工作者提供更方便快捷的应用服务,是水文模型服务化应用的主要研究方向[6,12]。

在开放网络环境下,模型服务化是当前实现模型封装与共享的主流方式[13-15]。模型服务将水文模型的业务逻辑和数据流程统一封装,用户只需调用统一的服务接口即可实现模型的调用,既简化了水文模型的使用,又保证了模型共享的安全性。因此,本文研究了一套水文模型的多粒度拆分与服务化封装方法,以为水文业务提供灵活、高效、可共享的模型服务。

1 模型的服务化封装与组合

1.1 服务化封装策略

由于水文模型的跨流域性、多样性等特点,模型调用接口(.exe、.dll等)、编程语言 (Fortran、C/C++、Java等)、操作系统 (Windows、Linux)等方面存在异构[16-18]。为了实现水文模型不同调用接口、服务容器和应用平台的服务化共享,将模型服务流程划分为服务定义、服务应用和服务管理3种角色。服务定义负责模型描述、模型内部水文分析算法与模块的设计实现、模型内部数据交换格式与流程定义等;服务应用面向服务消费者,负责按模型描述和数据格式、流程定义对输入数据进行数据预处理,然后调用模型服务获取运行结果;服务管理根据模型描述信息,将服务定义注册发布的模型服务添加(更新)进模型库,并根据服务应用的需求进行分项管理。水文模型服务化封装方法逻辑流程如图1所示。

图1 模型服务化封装方法流程Fig.1 Flow chart of service-oriented encapsulation method for model

1.2 接口抽象化

服务化封装的目的是面向水文应用业务,屏蔽模型间的异构性、复杂性,使得服务调用者专注于业务需求,直接面向更直观、更方便调用的服务接口。模型服务定义方根据模型服务化封装的应用需求,可将模型服务抽象为服务描述、服务操作和服务部署三类接口。

a.服务描述接口以结构化方式定义服务相关的语义信息(如服务标识、名称、类型、提供者、服务简介、适用区域等)并提供资源信息(如使用手册),实现模型定义、分类以及原理等描述信息的规范性表达。

b.服务操作接口采用面向对象的事件-状态响应机制,将模型的操作运算过程封装成事件-状态响应信息流,通过对服务输入输出和服务运算操作行为的结构化、流程化定义描述,实现服务与内部流程间的映射。

c.服务部署接口以结构化的形式提供模型部署所需的环境信息、服务调用URL及输入参数列表信息等,实现服务部署信息的形式化描述及方便快捷部署。

1.3 服务颗粒化

为了满足可动态组合配置及可共享服务的应用需求,水文模型遵循最小化、模块化、可独立运行和软件工程建设原则,将模型中的各业务流程分解成不同的功能模块和计算单元,并按具体的业务应用需求进行动态组装和重配置,形成面向应用需求的水文模型。

结合水文分析业务应用,提出数据-算法-模块-模型4个层面的模型服务化封装粒度。①数据服务将数据读写操作封装成统一的输入输出接口,为业务操作提供标准化的数据读写服务;②算法服务将业务应用中不可再分的最小逻辑单元封装成统一的运算逻辑,如水文过程中的某个具体计算公式(曼宁公式)或方程(下渗方程)等;③模块服务是按照一定的逻辑调用一系列算法服务实现的某类特定功能的服务组合,如网格单元产流过程、汇流过程等;④模型服务则根据洪水预报业务需求,组合不同的模块服务,形成针对某个特定区域的某类具体业务应用,如依据预报流程调用蒸散发模块、融积雪模块、壤中流模块、地表径流模块和河道径流模块,组合得到针对特定流域的TOPKAPI预报模型服务[3]。

水文模型服务框架如图2所示,图中的正方形、三角形和圆形分别代表模型、模块和算法层面的服务节点。模型分析实现了模型业务功能的原子化多粒度拆分解耦及业务流程的分离,减少了服务之间的重叠,增强了服务的独立性和逻辑耦合性。服务组合则依据不同场景的具体业务应用需求,分别选择不同的算法服务组合成模块、不同的模块组合成模型。

图2 水文模型服务框架Fig.2 Service framework of hydrological model

1.4 服务注册与组合

将独立完成基本业务功能的最小颗粒服务封装成算法,按业务类别,将算法统一注册并发布到模型库,采用结构化语言描述各算法的接口信息,形成多类业务服务集合,为服务组合提供基础。服务组合包括服务的组合应用和组合管理。

a.服务组合应用:依据应用需求,调用和读取算法接口,将一个或多个算法服务重组成模块服务,以满足简单预报分析业务的需要;并进一步调用多个模块服务重组成模型服务,以满足综合预报分析业务的需要。服务组合后形成的模块服务或模型服务也可通过服务注册发布到模型库供用户调用。

b.服务组合管理主要实现算法-模块-模型服务的更新重组。算法服务更新,在水文分析流程不变的情况下,模块服务和模型服务无需更新;模块服务功能发生变化,需要重组模块服务,模型服务相应需要重组,算法服务不变。

服务组合实现了算法-模块-模型的动态服务组合与共享:按一定的逻辑流程调用若干个独立的算法服务可以组合形成模块服务,同一算法服务可以被多个模块服务共享调用;同理,调用若干个模块服务可动态组合成面向特定应用需求的水文模型服务,同一模块服务也可被不同的模型服务共享调用。

2 模型的服务化封装

2.1 数据服务化封装

水文业务应用中的数据和种类多源,水文数据库中存储的水文数据按照业务可分成基础水文信息、实时雨情水情、水环境、土壤墒情等。对水文数据服务化封装包括数据描述、数据操作和服务部署三类接口。数据服务化封装方法如图3所示。

图3 数据服务化封装方法Fig.3 Service packaging method for data

数据描述接口定义了数据集的访问地址、服务标识、访问模式、读写权限等信息。数据操作接口完成对数据的读写、读写条件和读写结果等的封装。服务部署接口实现服务配置、服务调用接口和服务调用参数列表等数据服务的发布和部署配置。数据服务化封装对用户屏蔽了数据内部的计算过程,算法或模型只需调用数据服务化封装中的相应接口即可完成对数据的存取和计算,实现了模型的统一数据调用。

2.2 算法服务化封装

算法是水文模型模块化分解中的最小逻辑单元,如数学公式和物理规律等。通过对水文基础业务功能特征分析,水文算法可以封装成算法描述、算法操作和算法部署三类服务接口。①算法描述接口定义了算法的服务标识、名称、类型、简介等信息,便于用户识别和调用。②算法操作接口定义数据输入、计算流程和执行结果,其中数据输入调用数据服务接口并将数据进一步整合或处理成算法执行所需数据;计算流程是算法服务化封装的主要部分,实现算法中的水文业务逻辑和水文计算;执行结果将计算流程中产生的结果输出至JSON格式或文件类型数据。③算法部署接口实现算法服务的发布和部署配置,分别定义服务部署配置、服务接口的URL、服务所需的输入参数等。

图4 算法服务化封装方法Fig.4 Service packaging method for algorithm

同一类型的水文过程具有相同(相似)的输入输出和不同的计算方法,可以将不同的计算方法封装成算法服务并组成同类过程算法库,为水文过程的模块组合提供多种可能性。如蒸散发过程中根据土壤特性涉及上层、下层和深层蒸散发计算,因此,可以将土壤上层、下层和深层蒸散发计算封装成的3个算法加入蒸散发过程算法库,并依据具体应用场景选择不同的蒸散发算法组合成不同的模块。

2.3 模块服务化封装

模块是可组合成模型、能完成某些特定功能并具有明确调用接口的独立服务单元[19]。传统水文模型大多是封闭独立系统,模型中存在大量冗余和重复模块。如传统新安江模型和陕北模型都包含有蒸散发模块、汇流模块和河道汇流模块[20],尽管两个模型中蒸散发模块的具体过程(上层、下层和深层蒸散发计算过程的组合)不一,但其基本原理和实现功能基本一致。因此,本文采用面向对象模块化封装和拆分思想,根据水文模块具体实现的功能,选择不同的算法服务化封装成不同的模块,以提升模块服务的共享能力和可扩展性。

如图5所示,水文模块的服务化封装思路大致与算法服务化封装一致,两者的区别主要在于水文模块除了实现自身特有的计算逻辑外,有时还需要调用其他算法或模块,因此,模块服务化封装实现流程分为自身计算流程和外部调用流程两部分。模块自身计算流程与算法的操作类型一致,主要调用封装的算法实现逻辑需求;外部调用流程则通过配置接口相关参数调用其他模块接口实现模块服务间的调用。

图5 模块服务化封装方法Fig.5 Service packaging method for module

将功能相同、计算过程不相同的算法服务进行组合并封装,形成模块服务。如调用上层蒸散发算法得到一层蒸散发模块,调用上层、下层蒸散发算法组合得到二层蒸散发模块。为便于模型组合调用,将具有相同功能特点的模块进行分类并构建模块库。图6为蒸散发模块库和汇流模块库中模块的组合服务化封装实例,用户可以根据应用场景选择不同的算法,构建满足需求的模块,从而实现算法-模块的动态组合,提升算法的共享和模块组合服务能力。

图6 模块服务化封装实例Fig.6 Service packaging example for module

2.4 模型服务化封装

模型服务化封装的主要工作是依据流域特征及适用条件,选择合适的模块服务动态组装配置成不同的水文模型服务,最后通过模型部署接口将模型注册到模型库,实现模型的动态组合配置和集成共享。模型服务化封装及其流程如图7所示。

图7 模型服务化封装方法Fig.7 Service packaging strategy for model

模型描述接口定义了模型服务标识、名称、类型、作者、版本号、服务简介等基本信息。模型操作接口定义了模型实现所需的输入、模块服务组合配置、结果输出,其中模块服务组合配置通过调用模块服务接口、配置其执行顺序及模块间的信息交互实现模型的动态组合功能。模型部署接口实现将模型注册到模型库并部署配置的功能。

3 实例验证

3.1 栅格新安江模型服务化封装

栅格新安江模型(Grid-Xin’anjiang Model,GXM)[4]是融合数字高程模型(digital elevation model,DEM)和新安江模型构建的分布式水文模型。GXM将研究区域划分为正交的单元网格,然后采用新安江模型计算每个网格单元的产流和三水源,最后依据单元网格的演算关系计算出口断面流量。GXM按其功能可划分的算法-模块-模型服务组合结构如图8所示。

图8 栅格型新安江模型的模块-算法拆分Fig.8 Module-algorithm decomposition of GXM model

本文将相应的模块和算法进行了服务化封装和部署,然后依据GXM的计算流程,调用图8中所需的算法服务组合成相关的模块服务,然后再调用组合的模块服务构建模型服务。算法-模块-模型服务经注册部署后,形成的服务列表如图9所示。

图9 栅格新安江模型组合配置Fig.9 Composition and deployment of GXM model

3.2 模型服务化应用

皖南横江流域位于新安江上游,是典型的南方湿润山区气候,其主要控制站屯溪水文站集水面积2 696.76 km2。屯溪以上流域属山区性河流,年降水量在1 500 mm以上,主要集中在5—9月,由于受地势变化及土壤植被等因素的影响,夏季多发洪涝灾害。本文以新安江屯溪水文站以上流域为例,开展GXM服务化封装的应用分析。

将GXM的算法-模块-模型服务化封装后注册到中小河流洪水预报平台模型库,便可在门户系统中查询模型服务,通过在用户界面中输入模型执行所需参数和数据文件后,点击“调用”按钮,即可调用栅格新安江模型服务进行相应的预报。图10为2016年6月20日15:00至21日15:00GXM模型预报的屯溪水文站断面流量结果。

图10 栅格新安江模型服务调用与运行结果Fig.10 Call and running results of GXM model service

4 结 语

本文以解决水文模型的异构化、实现模型的共享应用和组合配置为目标,进行模型服务化封装方法与应用研究。提出了面向对象的服务化封装和组合配置方法,定义了模型描述、操作和部署接口等封装内容,实现了水文模型的数据-算法-模块-模型多粒度拆分解耦与服务化封装,提升了业务需求驱动的水文模型组合配置和模型共享能力。基于该方法设计了洪水预报模型服务框架,并应用于中小河流洪水预报预警智能调度决策支持平台,验证了该方法的可行性和有效性。但是,目前模块和模型的封装及组合配置要采用人工方式进行,后续应研究基于工作流的模块模型自动组合配置方法,以进一步提升模型的共享能力和服务能力。

猜你喜欢
服务化调用水文
制造企业服务化程度、服务化模式和服务化收益研究
发展水文经济 增强水文活力
浅谈水文档案的价值和开发利用
基于行业异质性的制造业服务化对生产效率的非线性影响研究
核电项目物项调用管理的应用研究
制造业服务化对企业竞争力的影响
系统虚拟化环境下客户机系统调用信息捕获与分析①
江西省水文文化建设的思考
利用RFC技术实现SAP系统接口通信
C++语言中函数参数传递方式剖析