首页 > 范文大全 > 正文

一种基于消息队列的数据自动计算方法

开篇:润墨网以专业的文秘视角,为您筛选了一篇一种基于消息队列的数据自动计算方法范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:为了提高监控系统工作效率,通过使用服务和作业调度,应用触发器和存储过程强大的功能,构建了消息队列和计算流,实现了数据的自动计算。

关键词:服务 作业调度 触发器 存储过程 Transact-SQL语言 消息队列

中图分类号:TP311.138 文献标识码:A 文章编号:1007-9416(2013)04-0170-03

随着信息科学技术的发展,越来越多的应用系统被定制或开发出来。这些信息系统应用在不同的企业和部门,建立在不同的操作系统和底层架构之上。管理这些系统成为问题摆在IT人员面前。一般地,管理任务主要包括查看、监控系统的重要信息,如:运行情况、绩效指标等与时间相关的数据,并将这些信息集中展现在终端、通过邮件或短消息告知管理人员。

现有监控系统大多都是通过直接访问数据源,计算监控指标,将结果显示给用户。这在WEB网站大量访问的情况下,尤其是资源敏感性的计算,导致性能上的瓶颈问题。由于大多数情况下,数据源的数据并不是实时变化的,对不变化的数据进行重复计算是浪费资源、低效的作法,本文针对此问题提出了一种改进方案,并通过石化产品调价预测为实例说明如何实现任务的高效自动化监控管理。

1 功能结构

监控系统功能结构如图1所示。原有方案显示为虚线,改进后的方案显示为实线。其中数据源模块对基于时间序列的数据进行预处理,捕获模块抓取变化的数据、事件,存储模块对变化数据、事件及目标存储,目标数据包括系统运行情况、绩效指标等,计算模块通过对变化数据计算得到目标结果,模块将目标集中展示在终端。

1.1 捕获模块

捕获模块是监控系统的核心模块,在实际中数据源不同,实现方式也不同。下面讨论关系数据库下的可能实现方式。

(1)数据库日志。通过充分利用重做日志文件中的数据,在SQL语句完成DML操作后,变化数据被捕获。Oracle 9i及9i以上版本的异步改变数据捕获[1]就是采用这种方式。它的优点是:在完整性上,它可以捕获INSERT、UPDATE和DELETE操作的所有改变,包括UPDATE操作前后的数据值;在性能上,因为它既不是事务的一部分也不需要查询表和视图,对数据库有最小的影响。缺点是:它不是实时捕获的,其次它需要依赖于DBMS提供的工具或接口。

(2)触发器原理。在SQL语句执行DML操作时,源数据库中的触发器允许变化数据立即被捕获。Oracle 9i及9i以上版本的同步改变数据捕获就是采用这种方式。它的优点是:它是实时捕获的,其次在完整性上,它可以捕获DML操作的所有改变。缺点是:因为它是事务的一部分,对源数据库的性能有影响。

(3)复制技术。复制是在组成分布式数据库系统的多个数据库间,拷贝和维护数据库对象的过程,一个站点上改变的数据被捕获和存储在本地后,被转发到每一个远程站点。SQL Server的/订阅模式就是采用这种方式。

1.2 计算模块

计算模块是监控系统的重要模块,根据不同的体系结构有不同的实现方式,相对于其它模块更消耗CPU资源。它可以在WEB页面实现,也可以在数据库端实现。由于数据源是数据库的处理对象,用数据库处理更直接高效,不适合在WEB页面处理。计算模块流程图如图2所示。

1.3 存储模块

存储模块是监控系统的枢纽,捕获模块、计算模块和模块都通过存储模块关联,发生数据交换。

综上所述,各个模块要根据单一职责原则[2]实现松耦合。由于变化的数据和生成的数据产生的频率不同,有较大差别,所以为了高效处理这些数据,缩短执行时间,根据信息系统的架构原则,将三个模块设计成异步并行执行的进程。

2 案例需求描述

石化产品调价预测是在分析研究国家价格政策和中石化价格规定的基础上,参考国际和国内市场价格,并运用一组数学函数(依赖于运杂费、税率、汇率、进口依存度等多个随时间变化的变量)来预测产品价格和涨跌情况。当任何一个依赖变量发生变化时,预测值将发生变化。WEB显示页面(部分产品)如表1所示。

3 关键技术解决方案

下面详细描述在SQL Server数据库下实现各功能模块的技术方案。

3.1 捕获模块

捕获模块通过触发器实现。触发器[3]是特定类型的存储过程,它不会被应用直接调用,只在用户对表完成特定的修改时(INSERT、 UPDATE或DELETE)它被执行。

虽然触发器对数据库性能有影响,但它是实时的,为了扬长避短,在触发器逻辑里只包含最简单的写入队列表语句,使事务持续时间尽可能短。

3.2 计算模块

3.2.1 作业调度

计算模块通过作业调度调用。SQL Server Agent[4](称为)运行为windows服务,执行编排好的管理任务(称为作业),监视SQL Server运行及触发警告。这些任务可以是可执行程序、操作系统命令、T-SQL语句(包括存储过程)、PowerShell脚本和ActiveX脚本。

3.2.2 存储过程

计算模块通过存储过程实现。存储过程[5]是一组预定义、预编译的T-SQL语句,编译一次,执行多次,所以增加了存储过程的执行性能。存储过程能够接收参数,返回结果集、代码或输出参数给调用应用。计算模块包括三个存储过程:

(1)出队过程从队列表取出计算实体(变量);

(2)订阅过程在对照表中查找计算实体对应的存储过程;

(3)核心过程执行具体业务逻辑,更新目标表。

3.2.3 T-SQL语言

存储过程由T-SQL语句组成,T-SQL语句遵循T-SQL语言语法。SQL Server提供以下特点控制T-SQL语句的使用:

(1)变量保存数据,用作T-SQL语句的输入。存储过程参数也是一类特殊的变量。

(2)控制流语句控制T-SQL语句、语句块、用户定义函数和存储过程的执行。

(3)错误在两个层面被处理。首先,通过增加错误处理代码到T-SQL语句、存储过程、触发器或用户定义函数来处理错误。其次,错误可以返回到调用应用,并在应用代码中被处理。

3.2 存储模块

变化的数据存储通过队列表实现。一般情况下,队列表是先进先出的,但在案例中由于要求显示最新价格,所以后捕获的数据优先处理。队列表的使用来自于消息队列架构模式,它实现了可靠性和可缩放性,减少服务器崩溃和重启的风险。处理流程如下:

(1)发送应用准备消息,放消息进队列;

(2)消息被保存在消息队列存储库中等待被处理;

(3)接收应用从队列取出消息并处理它。

发送应用和接收应用是松耦合的。如果接收应用离线,所有消息被保存在库中。一旦接收应用重新在线,消息被自动接收并处理。

4 编程实现

4.2 建立触发器

4.3 配置计算依赖对照表

一个变量表可以用在多个产品预测计算中,一个产品预测计算可能从多个变量表取数,所以变量表与执行产品预测计算的存储过程是多对多的关系。

根据4.1的分析,并且由于表b_cpjggl和b_xzz含有产品字段,表b_webtjcs适用于所有产品,所以在计算依赖对照表(b_tjyc_sp)中增加两条记录,一条对应于含有产品字段的表,一条对应于b_webtjcs,如表2所示。

4.4 创建存储过程

4.5 存储模块

5 性能分析

表3是新旧方案的性能对比,是通过多天的同一时间段统计的。由于原有方案的计算模块通过WEB页面实现,而且各功能模块是顺序执行的,所以从平均计算时间可以看出原方案计算效率很低。新方案的功能模块通过松耦合、异步并行的实现,程序的执行效率、页面的响应性大幅度提高,作业调度每分钟执行8次存储过程,达到了实时处理的要求,石化产品调价预测在实际应用中取得了很好的效果。

6 结语

可见,为了使信息系统的监控简单化、直观化、高效率,需要对原有方案进行评估和改进,通过预先定制许多自动化的任务实现高效运行。分析、设计、实现任务自动化需要对原有系统哪些地方可能成为未来运行过程中的瓶颈有所认识,同时对应用系统依赖的底层平台有深刻的认识,了解平台提供了哪些组件可以直接使用,哪些组件还需要配置、装配,哪些组件需要开发,这样才能使信息系统的自动化监控成为可能,最终变成现实。

参考文献

[1]Oracle Corporation.Asynchronous Change Data Capture Cookbook [M].America: Oracle Corporation,2006.

[2] Eric F,Elisabeth F,Kathy S,Bert B.Head First Design Pattern[M].America: O’Reilly Media Inc,2004.

[3] Kevin E,Daniel K,Brand H.SQL in a Nutshell[M].3rd ed,America: O’Reilly Media Inc,2009.

[4]李香敏,徐进,姜世锋.SQL Server 2000编程员指南,China: 北京希望电子出版社,2000.

[5] Tony B,Louis D,Robin D,Chunk H.SQL Server 2000 Stored Procedures Handbook[M].America: Apress,2003.