全国水情信息交换系统升级完善优化设计
2021-08-27宫博亚孔祥意
王 容,宫博亚,孔祥意
(水利部信息中心(水利部水文水资源监测预报中心),北京 100053)
0 引言
全国水情信息交换系统于 2012 年正式投入运行,实现了水利部、7 个流域机构、31 个省(区、市)、234 个地级市约 4.2 万个站点的雨水情信息的实时交换,报汛信息 10 min 内可由测站经地市、省或流域到达水利部。2013 年全年水利部接收全国雨水情信息 3.25 亿条[1],未出现数据严重滞时、统计停滞、系统崩溃等问题,有力支撑了防汛抗旱雨水情信息服务工作。
但是,随着国家防汛抗旱指挥系统二期工程、中小河流水文监测、县级山洪灾害防治非工程措施等项目的实施,截至 2018 年底,通过水情信息交换系统报送信息的站点已增至 10.9 万个,较之前增加了 1.6 倍,交换信息量大幅增加。2018 年全年水利部接收全国雨水情信息达 9.60 亿条[2],尤其是月初或多条江河发生洪水期间,高峰期 1 h 内(8—9 时)信息接收量突破 500 万条,水情信息交换系统频繁出现接收文件入库时间大幅增加、统计分析停止运行等问题。此外,自 2014 年起,由于部门之间数据共享需求,全国水情信息交换系统需向多家单位发送全部站点的雨水情信息,且在收到信息后 5 min内转发出去,极大占用了系统资源,从而影响了系统的接收、统计分析、实时监控等功能,甚至造成系统崩溃,严重影响了雨水情信息的时效性和稳定性,无法满足每日 9 时防汛抗旱水情会商需求。
为此,通过分析全国水情信息交换系统技术框架、信息传输各个环节,基于原有系统的发送和接收流程,提出采用多个线程并行处理、微化服务独立控制、多维文件交换统计等技术和方法,对系统信息发送、信息接收、统计分析、信息监控等核心层模块进行完善升级优化设计,有效提升水情信息交换效率。
1 系统现状
水情信息交换系统软件基于 .Net 技术框架开发,采用 Web Service 技术实现远程数据传输,利用Ajax 技术实现良好的界面交互效果,主要包括数据库升级、信息发送、信息接收、统计分析、信息监控等 5 个子系统[3],其中信息发送、信息接收、统计分析等子系统均采用单线程串行处理模式,逐层处理,能及时准确地定位到工作节点,并与数据库直接交互,减少中间环节,实现每日百万级数据量的数据交换及统计。
信息发送采用触发和轮询机制相结合的混合模式,在发送节点的数据库平台内构建触发器,将发生变动(插入、修改及删除等)的信息写入待交换的数据库表单中,再启用轮询模块监控待交换表单,定时处理生成待交换的数据文件,通过 Web Service 发送到接收节点;信息接收基于 Web Service函数接口自动接收数据文件,并启用数据入库模块,将文件中的数据信息写入数据库表单中。信息发送、接收流程图如图 1 所示。
图1 信息发送、接收流程图
随着数据量的逐年剧增和网络安全控制,水情信息交换系统原有的处理模式及交互方式在中央级节点运行逐渐形成瓶颈,具体如下:信息发送、接收处理能力接近饱和,发送信息采用单线程逐一循环向所有接收节点发送文件,如遇某单位网络堵塞将会影响所有单位的发送时效;接收信息入库处理滞时,一旦备用数据库出现异常,将会出现大批量延时;抛弃备用数据库,又将导致主备数据库数据不一致;统计线程直接连接数据库表单在闲时进行统计,但因发送和接收记录表单全部被发送和接收处理线程占用,统计停滞导致记录表数据无限增长,数据库承压能力有限,最终引发系统崩溃。
2 优化技术及方法
2.1 多个线程并行处理
以并行工程思想为主导,构建了信息发送、接收核心模块的主线程,基于主线程的并行运行,按照类型和时间等不同维度,拆分次线程,并对每个线程进行梳理,分析主次线程的逻辑关系,将可以并行交叉的线程尽量并行交叉,按照优先级划分,采取避让原则,保证线程尽早工作,提升运行效率,避免线程相互争夺资源。同时为减少空闲线程资源浪费和 CPU 时间片之间线程上下文频繁切换等问题,利用缓存线程池创建和管理线程,按照单例原则,同一种任务禁止有多个线程同时执行[4]。
信息发送模块划分为数据轮询、文件发送、信息入库 3 个主线程,其中:数据轮询线程处理待发数据,并在生成待发文件后延时 5 s 启动文件发送线程,以避免发送线程空转,最大化提升线程运行效率;文件发送线程采用多线程并行处理模式,向每个发送单位同时发送文件。信息接收模块划分了文件接收、入库、处理,以及业务数据、接收信息入库 5 个主线程,其中:文件接收线程并行接收数据文件;文件处理线程将 1 个接收数据文件拆分成多个与表单匹配的入库文件;业务数据入库线程按照表单类型并行入库。
信息发送模块中的信息、接收模块中的文件和接收信息等的入库线程,负责将发送和接收信息写入数据库记录表单中,3 个线程均与统计分析模块中的库表数据删除、信息监控模块中的实时页面监控统计等线程存在资源争夺,因此设置了优先级并进行了避让。库表数据删除线程启用时每删除 5 000 条发送记录,线程暂停 1 s 让出表单,用于发送和接收信息入库;发送和接收信息每入库 5 000 条记录,线程停止 0.5 s,以确保实时页面监控统计。信息发送、接收模块线程拆分图如图 2 和 3 所示。
图2 信息发送模块线程拆分图
2.2 微化服务独立控制
在原有的单一服务控制线程的模式下,根据业务逻辑将线程进行了归并,基于 IIS(互联网信息服务)的 .Net 应用程序池将服务进行分组,构建信息发送、信息接收、统计分析、实时监控等 4 个独立的微服务,服务之间不受彼此影响,有效提升了资源分配精细度,并以服务为主线,依次控制主线程和子线程,方便用户快速定位问题。同时,提供了服务线程在线监控功能,用户可自主控制线程,进行某一线程的暂停和启动,当线程异常时会及时告警,并采用声音和图标的方式提醒用户,提供每个线程相应的日志文件,方便维护管理,系统运行处于可控和透明状态。
图3 信息接收模块线程拆分图
2.3 多维文件交换统计
全国水情信息交换系统中数据交换统计模式由原来完全依赖数据库调整为以本地文件为主导的模式。系统按照单位、信息发送和接收、统计等类型,以及时间维度,将数据文件进行拆分,优化了文件管理目录结构,并建立基于二叉树的不同索引,实现对不同数据的灵活高效的存取计算,每类数据文件有独立的线程计算处理,通过标记文件方式防止数据丢失[5]。系统较大程度地减少了与数据库的交互,减轻了数据库读写压力,降低了数据库读写占用的网络带宽,对数据的接收和发送提供了更大的有效带宽,并最大化地为数据库减负。同时也避免当数据库出现异常、系统服务器与数据库之间通信中断而造成的业务流程重复死锁现象。文件管理目录结构图如图 4 所示。
图4 文件管理目录结构图
3 优化设计
全国水情信息交换系统使用范围较广,系统升级完善主要以实际运行中出现的性能瓶颈进行优化,并与原有系统进行无缝对接,确保全国水情信息交换工作可正常运行。系统核心层包括信息发送、信息接收、统计分析、信息监控等 4 个模块,优化设计主要以核心层为基础进行优化,并完善扩充了系统维护和管理功能,最大化地提高水情信息交换效率,提升系统友好性。
3.1 信息发送
信息发送模块将实时入库的水情信息按需打包成数据文件,同步发往多个接收节点。系统优化主要是提升信息发送效率,解决发送延时和自动处理数据库异常造成的发送停滞等问题。发送服务主线程之间采用监视模式,整体优化了发送流程,文件冗余存储模式减少了系统与数据库之间的交互,避免了数据库异常引发的发送问题。文件发送采用多线程并行发送模式,使得数据轮询批量处理能力大大提升。
当实时库表单中发生添加、修改、删除操作时,基于触发器会自动触发生成待发送数据并写入待发送数据表中,数据轮询线程批量处理待发送数据并生成待发送文件,如遇数据库异常操作中断,待数据库恢复后,将重新生成待发送文件;文件发送线程可并行向每个发送单位同步发送文件;信息入库线程将发送文件和数据等记录写入数据库表单中,并可实现同步状态更新。信息发送服务流程示意图如图 5 所示。
图5 信息发送服务流程示意图
3.2 信息接收
信息接收模块接收外单位发来的文件后,实时解码入库。系统优化主要是提升信息接收、入库效率,保证主备数据库信息的一致性,解决入库延时问题。接收服务 5 个主线程之间采用监视模式,多线程实时并行接收处理文件,将接收文件进行预处理拆分,启用多线程并行处理入库,写入主数据库后,同步写入备用数据库。
文件接收线程基于 Web Service 函数接口自动同步接收多个发送节点的数据文件;文件入库线程将文件记录批量写入数据库表单中并更新状态;文件处理线程将文件按照表标识实时拆包,生成主数据库待入库文件;业务数据入库线程独立运行主备数据库入库线程(可支持 5 个入库主线程),并根据表标识拆分为 78 个子线程(1 个表单对应 1 个子线程),实时监视对应表单待入库文件,完成数据入库;接收信息入库线程将数据入库记录写入接收信息记录表,并将已成功入主数据库的数据打包生成备数据库待入库文件,并进行强制入库处理。信息接收服务流程示意图如图 6 所示。
图6 信息接收服务流程示意图
3.3 统计分析
统计分析模块用于统计每日发送和接收的信息数据量及时效性,及时删除数据库表单中的存储文件记录、发送和接收信息记录数,以及本地存储的文件,避免数据库和系统服务器出现因存储空间不足而引发的系统崩溃问题。系统优化主要是提升统计效率,扩大自动删除范围,解决统计分析线程停滞问题。
统计分析服务划分以下 4 个主线程:1)发送统计,包括报送任务站数、实际报送信息站数、报送信息总量、自定义时间内(5~30 min)报送信息量等统计信息;2)接收统计,包括报汛任务站数、实际接收信息站数、接收信息总量、自定义时间内(5~30 min)接收信息量;3)库表数据删除,涵盖信息发送、接收生成的数据记录及统计数据;4)本地文件删除,涵盖信息发送、接收,以及统计模块预处理生成的数据文件。
发送和接收统计摒弃了原有通过数据库表单进行统计的方式,避免与发送和接收线程争夺资源的状况,直接生成相应的统计文件进行单独统计,并将结果写入数据库统计表单中,统计时效性参数由30 min 调整为自定义设置。
3.4 信息监控
信息监控模块具备实时和远程 2 种监控功能,主要为用户提供实时监控页面,显示各节点发送和接收信息的状态、网络连接情况及系统日志等。系统优化主要提升监控页面友好性及实时监控统计效率,完善系统异常告警功能,解决待处理数据无法远程处理的问题。信息监控服务划分了实时页面监控统计、网络检查、数据库状态监视 3 个主线程,完善了实时信息监控统计方式,细化了异常告警信息,增加了主备数据库待入库信息统计及待处理数据远程处理的功能。
实时页面监控统计线程实时统计读取监控页面显示的发送/接收节点的文件和数据记录数,主备数据库待入库文件数,以及系统日志、异常告警等信息;网络检查线程定时检查每个节点的网络连接状态;数据库状态监视线程定时检查主数据库和各备用数据库的连接状态。同时,实时监控提供系统设置、人工操作、管理维护等操作功能,远程监控提供待处理数据处理功能,页面统计的文件和数据记录均可进一步查看详细信息,异常告警文件提供错误问题在线编辑功能。
4 结语
全国水情信息交换系统将多个线程并行处理、微化服务独立控制、多维文件交换统计等技术和方法,融入核心层模块,优化了信息发送和接收流程,解决了系统的耗时、资源争夺等问题。目前系统优化版本已在水利部及流域和部分省级水文部门的节点部署运行,历时 2 a 的测试期,系统应对大数据量的交换能力大幅提升,入库效率明显提高,早高峰基本无延时,发送效率显著提高,实时发送与信息入库时间差控制在 5 min 内,日均入库数据量由百万级提升到千万级,发送数据量由百万级提升到千万级,全力保障了 2020 年水情信息服务工作,有力应对了汛期长江、太湖、淮河、松花江等流域性洪水[6]。但系统的完善升级仍然沿用 .Net 技术框架,仅支持实时雨水情数据库(关系型数据库)中的结构化时序数据的交换和共享。后期,水情信息交换方式将全面升级改造,将基于水利云及大数据平台,搭建水情信息云交换数据平台,实现数据库级和多源异构数据的汇聚、交换,以及目录驱动交换,将全面支撑雨水情信息的交换共享,可为全国水旱灾害防御水情信息服务工作奠定基石。