消息代理装置、方法及计算机程序产品 本发明涉及客户/服务器(也称为“分布式”)计算领域,其中例如一个计算装置(“客户”)请求另一计算装置(“服务器”)执行部分客户的工作。
在信息技术界过去几年来客户/服务器计算已经变得越来越重要。这种类型的分布式计算允许运行在一台机器上的一个过程(“客户”)将其某些工作委托给运行在例如可能更适合执行该工作的另一台机器上的另一过程(“服务器”)。客户和服务器有可能是运行在同一台物理机器上的两个过程。
消息排队数据处理技术在当今的客户/服务器计算机网络中变得越来越流行。这一技术允许客户计算机系统与服务器计算机系统通信,即使这两个系统就操作系统、数据格式及通信协议来说彼此很不相同。而且,由于这种技术的异步性质,客户能够发送给服务器消息,而服务器能够在队列中存储该消息,并在稍后的时间处理和应答该消息。这与要求客户和服务器实时会话(例如,在客户执行其它任务之前客户等待服务器回答)的同步客户/服务器模型颇为不同。
在“Messaging and Queuing Using the MQI”,B.Blackeley,H.Harris& R.Lewis,McGraw-Hill,1994,以及从IBM公司可获得的以下出版物:“An Introduction to Messaging and Qeuing”(IBM文档号GC33-0805-00)和“MQSeries-Message Queue Interface TechnicalReference”(IBM文档号GC33-0850-01)中描述了消息排队和市售的消息排队产品。IBM和MQSeries是IBM公司的商标。IBM的MQSeries消息软件产品,根据即使系统或通信失败的情形下给出有保证的一次且仅只一次消息传递的传信协议,提供了交易传信支持,工作的逻辑单元内的同步化消息。MQSeries产品,通过在确认由接收者系统安全存储了消息之前不从发送者系统上的存储器最后删除消息并使用复杂地恢复装置,而提供了有保证的传递。在确认成功存储时,在消息转移的提交之前,对从发送者系统的存储器删除消息和向接收者系统的存储器插入消息都保持‘怀疑’,并能够在故障的情形下自动取消。在国际专利申请WO95/10805和美国专利5465328中描述了这种消息传输协议及相关交易概念和恢复装置,这些文献在此作为参考。
由于关系数据库通常用作为用于存储和检索大量相关数据的结构机制,把这种传信和排队系统与关系数据库系统组合起来正变得越来越普遍,诸如IBM的DB2产品或Microsoft的Access产品(DB2是IBM公司的商标,而Access是Microsoft公司的商标)。
例如,Sun Microsystems公司已经描述了(见欧洲专利申请No.806,731,1996年11月17日公布)一种用来执行发布/订购功能的传信和排队系统。服务器的作用是作为发布者,并对每一消息规定了一主题时发布该消息。客户的作用是作为订购者,并规定它们想要接收的消息的主题。传信和排队代理置于客户和服务器之间,并起到向适当的客户分配发布的消息的作用。系统允许数据库作为发布服务器提供,使得能够向网络发布大量的结构化数据。数据库还能够作为订购客户提供,存储接收的发布的消息以便对大量消息的方便和结构化的检索。这一系统没有描述传信和排队系统与关系数据库系统之间任何进一步的集成。
Oracle公司以其Oracle8 Advanced Queuing(AQ)(Oracle 8和Advanced Queuing是Oracle公司的商标)系统把这一集成向前推进了一步,允许客户应用程序(订购者)向传信和排队代理提交结构化查询,以便规定订购者希望接收发布的什么消息。订购者使用诸如SQL(结构化查询语言)等标准数据库语言规定意向主题的能力,使能够考虑到关于确切表达订购者希望接收何种类型的发布消息的高级特性。例如,订购者能够使用标准的SQL查询语句,以便规定订购者只有在股价大于每股100美元时希望接收所有发布的IBM股票报价。除了使用SQL语句之外,订购者还能够利用诸如由Microsoft Access产品等提供的各种可视关系数据库编程技术,以便于编程者确切规定订购者希望看见发布的何种类型消息。
Open Horizon公司以其Ambrosia 2.1产品(Ambrosia是OpenHorizon公司的商标)把这一集成进而向前推进一步,允许传信和排队询代理在向发出请求的订购者转达消息之前向发布的消息的内容添加主题。传信和排队代理把发布的消息接收到输入队列。如Oracle产品那样,使用标准的SQL技术确切规定订购者想看到发布的哪种类型的消息。然而,Ambrosia产品进而以关系数据库中存储的记录整理发布的消息中的信息。具体来说,一旦收到发布的消息,这时来自数据库记录的某些数据被添加到发布的消息的内容中,以生成与原来由传信和排队代理收到的发布的消息相比内容更详细的发布的消息。例如,如果在代理输入队列收到声称IBM股票现在列为每股125美元的发布的消息,则能够对代理编程从关系数据库检索信息,诸如包含顾客标识(例如C23)和该顾客现在拥有的IBM股票量(例如225股)的信息。然后从数据库检索的信息与发布的信息组合而生成更为详细的信息,即顾客C23拥有当前以每股125美元交易的225股IBM股票,然后该消息转发给先前已作为订购者登记的顾客C23。
虽然Ambrosia产品提供了超过上述其它产品可观的价值,但该产品还是有这样的缺陷,即必须写出专用的软件代码以便确切地规定如何整理发布的消息与数据库记录。
Active Software公司的ActiveWeb(Active Software公司的商标)消息代理产品类似于Open Horizon的Ambrosia产品,即能够把数据库内容添加到发布的消息以增加发布的消息的价值。ActiveWeb使用称为数据库适配程序的专用软件代码块进行整理(例如结合)操作。为了从发布的消息抽取数据,以数据库预期的确切形式把数据转换为数据库查询,从数据库检索数据以及对发布的消息和数据库数据进行特别的整理操作都需要这一适配程序。
这样,ActiveWeb同样有Ambrosia的缺陷,即必须提供专用软件块以进行例如把发布的消息与数据库记录结合在一起的这样的整理操作。对这种软件作出修改要求用户熟悉专用软件块的编程结构和语言。因而,虽然程序员可能发现,易于对消息代理其余部分作出修改,但必须切换到新的编程环境以便对执行整理操作的专用软件块作出修改。
根据一个方面,本发明提供了用于从发送者应用程序接收消息、处理所收到的消息并决定向哪一个接收者的应用程序转发所处理的消息的消息代理数据处理装置,该装置具有:用于从发送者应用程序接收消息输入流的装置,每一消息配置为具有至少一个字段的元组;用于整理消息的输入流与存储在数据库中的数据库数据的装置,数据库数据也配置为具有至少一个字段的元组;以及用于处理消息流的装置,使所得的消息流成为指向至少一个接收应用程序。
用于接收的装置、用于整理的装置以及用于处理的装置最好采用相互连接形成处理节点网络的多个处理节点,每一节点的处理功能由标准的关系语言中的关系表达式定义,并且消息元组流在多个节点之间通过。而且,对于网络中相邻的两个节点,节点1和节点2,定义节点1功能的关系表达式的输出由定义节点2功能的关系表达式的输入解释为消息元组流。
用于接收的装置最好与队列管理器通信。
在一优选实施例中,发送应用程序是发布器而接收应用程序是订购器。
标准的关系语言是结构化查询语言,且可视化数据库工具用来产生定义节点功能的关系表达式。
在一实施例中,两个节点之间存在的消息元组流中每一消息元组具有相同的字段集。在另一实施例中,两个节点之间存在的消息元组流中,流中的每一消息元组不一定具有相同的字段集。在后一实施例中,向在定义节点功能的关系表达式中使用的但是没有在输入到节点的流的特定消息元组中定义的字段指定零值。
在一实施例中,该装置包含在单数据处理单元上,而在另一实施例中该装置包含在多个互连的处理单元上。
根据第二方面,本发明提供了执行以上第一方面所讨论的功能的方法。
根据第三方面,本发明提供了用于当在计算机上运行时,执行以上第一方面所讨论的功能的计算机程序产品。
根据第四方面,本发明提供了使用第一方面的消息代理数据处理装置向顾客提供信息服务的方法,该方法具有步骤(a)从顾客那里接收关于顾客希望接收什么消息的准则;(b)从发布者那里接收发布的消息;(c)相对从顾客接收的准则比较发布的消息;以及(d)向顾客转发符合从顾客接收的准则的发布消息。
由于本发明按消息元组流向代理提供输入的数据,故易于整理输入数据与数据库数据,因为后者也被组织为元组。这样,整理数据流中的消息与来自数据库的数据的数据处理元件能够被无缝地集成到整个消息代理系统中。
通过把这一数据处理元件与整个消息代理系统无缝地集成,在对应当如何整理(例如合并或结合)数据流与来自数据库的数据的规定进行编程时,也能够使用用于对代理的其它部分编程的诸如可视化工具、接口和模型等相同的标准关系方法。这就大大方便了对整个代理系统的编程,因为始终能够使用相同的工具。
对于实现消息代理使用这种关系技术(特别是可视化工具)的能力使能够易于优化原来不能被有效编程的代理的任何部分。
而且,由于无缝集成到整理输入的数据流与存储的数据库数据的单元的整个代理系统中,通过代理的消息流(与先有技术的Ambrosia和ActiveWeb比较)有效得多地出现。
最后,本发明中所涉及的无缝集成更易于进行发生在整理单元内的处理,这种处理是把发生在消息代理其它部分的处理纳入整个交易的一部分。这就是说,如果代理的所有元素能够被同样对待,则更易于保持对系统范围处理的各方面的跟踪。
现在参照以下附图将说明本发明的优选实施例:
图1是表示根据本发明的一优选实施例关系消息代理的基本设置的框图;
图2是表示关于根据本发明的一优选实施例的关系消息代理的更详细情况的框图;
图3是表示图2的关系消息代理的一修改版本的框图。
图1中,设有发布者数据处理单元11,用于提供订购者希望接收的精确到一分钟的实时数据(在描述优选实施例中将使用股票数据,因为这是这种类型的代理的主要应用,由于股票数据是不断变化数据的好例子,并且这是基于很多订购者立即需要的)。发布者数据处理单元11能够运行在任何数目可用的计算机处理平台上。
诸如IBM的MQSeries产品(如队列管理器12所示)的传信和排队单元置于发布者数据处理单元11和订购者数据处理单元15之间。订购者数据处理单元15能够运行在任何数目可用的计算机处理平台上,且所选择的平台可以不同于发布者11所使用的平台。已知的队列管理器12(诸如MQSeries)负责所有必须的数据格式转换(例如协议等),以便允许发布者11和订购者15彼此以异步方式进行通信(例如,当消息正在由发布者11发布时,订购者15不必是操作的,消息存储在队列中,并当订购者15再次操作时订购者15能够检索这些消息)。通常向每一发布者和订购者指定不同的队列管理器12,队列管理器交互作用控制单元之间的消息流,然而为了便于说明,队列管理器12将作为单个实体描述。
应当注意,发布者11和订购者15可以运行在同一计算机上。在这后者情形下,就不需要对数据格式的转换,并且队列管理器12简单地从发布者应用程序到订购者应用程序为所发布的消息确定路由。
队列管理器12把它收到的发布的消息发送给处理该消息(如以下将说明那样)的关系消息代理13(该代理可能运行在一个中间数据处理单元或多个中间数据处理单元上),并把它们送回队列管理器12,以便将它们放入能够由订购者检索的适当的订购者输出队列中。图1中为了简单仅示出一个这样的订购者(和发布者),但是通常的情形要涉及多个发布者和订购者。
应当注意,如图1的虚线所示,使队列管理器12旁路,关系消息代理13还能够用于操作的同步方式。实际上,代理13能够用于没有提供队列管理器12的完全的同步环境。例如,这将涉及发布者和订购者总是处于操作的系统,于是就不需要队列管理器12的功能。
在执行这一处理时,代理13常常要访问数据库14。例如,发布的消息中的信息与存储在数据库中的信息结合,以便生成更有意义的消息,然后该消息发送给订购者。例如,发布的消息可以是IBM股价已经升高到每股150美元,而存储在数据库14中的数据库记录可能指示标识符为C3的特定的顾客拥有77股IBM股票。由代理13所执行的结合操作将把所有这些信息放在一起产生比发布的消息长的一个消息,该消息指出顾客C3拥有77股现在价值每股150美元的IBM股票。
如所周知,存储在数据库中的数据被组织成称为“元组”的行。例如,表1示出三个元组:
表1(存储在数据库中的数据样本)
公司 顾客 数量
IBM C3 77
IBM C2 44
Ford C3 120
第一个元组指出,顾客C3拥有77股IBM股票。第二个元组指出,顾客C2拥有44股IBM股票。第三个元组指出,顾客C3还拥有120股Ford股票。
根据本发明的优选实施例,从发布者11发送的发布的消息还被组织为元组。这样发布的消息流暂时被排序成元组列表。例如,表2示出两个消息的一个序列,每一消息被组织成元组:
表1(消息流中的样本元组)
公司 价格
IBM 160
Ford 44
第一元组指出现在IBM股票每股价值160美元。第二元组指出现在Ford股票每股价值44美元。
流中的每一消息元组能够具有相同的字段集(例如,公司和价格字段)。另外,流中的某些消息元组可能具有与对特定的被指定为零值的消息元组没有被定义的字段有不同的字段集。而且,虽然表2中所示的元组具有简单的数据(例如一个数或字符串),但字段可能还包含某些进一步的结构,诸如数组或嵌套元组。
由于发布的消息和数据库数据被排布为元组,故对发布的消息和数据库数据所需的整理可使用标准的关系表达式规定,这从以下对图2所示的关系消息代理13更为详细的讨论及随后的多个例子明显可见。
图2中,发布者应用P1(11)向队列管理器12发送排布为元组的发布的消息流,队列管理器12把该消息流转发给用于处理并向特定的订购者指定消息的关系消息代理13,此后消息流被发送回队列管理器12,以便传输给三个订购者应用S1(15a)、S2(15b)、S3(15c)。关系消息代理13配置为一组互连形成一网络的处理节点21、22、23。这些处理节点可能都位于相同的数据处理机,或它们可能分布在多个互连的数据处理机上。每一节点的处理功能由关系表达式以标准关系语言(例如SQL查询)定义,这将在以下更为详细说明。
一旦在代理13之内,发布的消息流首先由过滤器节点21处理,该过滤器滤除(丢弃)一些发布的消息,只允许一定的消息通过过滤器。例如,来自P1的发布的股票行情流一般将涉及来自大量公司的股票行情。可能订购者S1,S2和S3只对来自IBM和Ford的股票有兴趣。这样,过滤器节点21只允许是关于IBM或Ford股价的消息通过。过滤器节点21的功能在关系数据库技术中是熟知的,因为这是一个很普通的关系数据库运算(通常称为“选择”)。过滤器节点21的处理功能通过使用例如SQL SELECT语句的关系表达式定义,以便确切表达允许什么消息通过过滤器。
过滤器21的输出连接到连接运算器22的输入,该运算器把过滤后的消息流(只涉及IBM和Ford股票行情)作为第一输入。连接节点22从数据库14接收第二输入。当连接节点22从过滤器节点21的输出接收发布的消息时,适当的数据库元组被访问并从数据库14读出用于与发布的消息连接。连接节点22的功能在关系数据库技术中是熟知的,因为这是一个很普通的关系数据库运算。连接节点22的处理功能通过使用例如SQL INNER JOIN语句的关系表达式定义,以便确切表达消息流如何与数据库的数据连接。
例如,使用表1的数据库数据,当代理13收到表述IBM股价现在为每股160美元的第一发布消息元组(表2第一行中所示)时,该消息通过过滤器节点21,因为定义这一节点的关系表达式允许如果是涉及IBM或Ford股价的消息元组通过。当这一消息元组到达连接节点22时,该连接节点执行这一消息元组和表1的第一行中所示的元组的整理,以便提供表3的第一行所示更长的元组(它指出顾客C3具有77股当前价值每股160美元的IBM股票)。
表3(连接节点的输出处消息流中的样本元组)
公司 价格 顾客 数量
IBM 160 C3 77
IBM 160 C2 44
Ford 44 C3 120
然后这一连接节点22的输出被发送到队列管理器12以纳入S3的队列。然后只要订购者S3准备好检索信息,订购者S3(15c)就从该队列检索消息。根据图2的节点结构,S3将接收关于所有拥有IBM或Ford股票的顾客的消息。例如S3就是希望获得关于所有顾客股票所有权的审计。
这一相同的消息元组(表2第一行所示)也将在连接节点22与表1的第二行所示数据库元组连接,结果是表3第二行所示的一更长的元组(这指出顾客C2有44股当前价值每股160美元的IBM股票)。然后这一连接节点22的输出发送到队列管理器12以便纳入S3的队列。然后只要订购者S3准备好检索信息,订购者S3(15c)就从该队列检索消息。
连接节点22的输出还发送到队列管理器12以便纳入S2的队列。具体来说,连接节点22的输出发送到被编程为只能使与顾客C2相关的消息元组通过的过滤器节点23。过滤器节点23的处理功能通过使用例如SQL SELECT语句的关系表达式定义,以便确切表示将允许哪些消息通过该过滤器。表3第二行所示的消息元组与C2相关,于是将通过过滤器节点23被发送到队列管理器12以纳入S2队列中。然后只要订购者S2准备好检索信息,订购者S2(15b)将从该队列检索消息。
当第二发布的消息元组(如表2第二行中所示)到达过滤器节点21时,它将被允许通过过滤器节点21,因为该消息元组与Ford股价相关(具体来说,这一消息元组声称,当前Ford股价现在为每股44美元)。一旦通过过滤器节点21,这一消息元组到达连接节点22,在此它与表1第三行所示的数据库元组连接(因为这是涉及Ford的唯一的数据库元组),以提供表3第三行所示更长的元组(该元组指出,顾客C3具有当前价值每股44美元的120股Ford股票)。然后从连接节点22输出的这一消息元组被发送到队列管理器12,以便纳入S3的队列。然后只要订购者S3准备好检索信息,则订购者S3(15c)就从队列检索消息。从连接节点22(它涉及顾客C3)输出的消息元组不被允许通过过滤器节点23,因为过滤器节点23只允许涉及顾客C2的消息元组通过。
假设订购者S1对IBM和Ford股票很有兴趣,但还没有购买这两个公司的任何股票,也并不准备购买。例如,假设S1是基于当前IBM和Ford股票股价作出商务决策的金融代理人。这种情形下,不必涉及连接节点22,因为数据库14不包含S1所需的任何信息。这样,向过滤器节点21提供第二输出,并且过滤器节点21允许其通过的所有发布的消息元组(关于IBM和Ford股价的股票价格)从这一第二输出被输出。然后该消息传送到队列管理器12以便纳入S1队列。然后只要订购者S1准备好检索信息,则订购者S1(15a)就从队列检索消息。
这样,代理13的每一节点的功能完全以数据库专用的术语定义。每一节点具有以诸如SQL标准的关系语言表示的关系表达式。一个节点的关系表达式的输出是作为对相邻节点的关系表达式的输入而提供的消息元组流。过滤器节点21和23使用数据库关系代数通用的SELECT功能。连接节点22使用数据库关系代数通用的INNER JOIN功能。虽然发生在数据库14和发布的消息之间的整理详细描述为“连接”运算,但为了整理数据库数据与发布的消息可实现许多其它的关系代数运算,诸如“求交”,“计算”或“求并”运算。
现在将给出可用来定义节点功能的关系表达式的一些例子。
例子1:过滤
这例子的过滤节点(21)以SQL由以下定义
SELECT*
FROM Stock
WHERE Company=“IBM”OR Company=“Ford”
例子2:连接
假如把从节点21的输出流命名为Q21,保持信息的顾客的数据库关系命名为Holding。则连接节点(22)可由以下定义
SELECT Q21.*,Customer,Quantity
FORM Q21 INNER JOIN Holding
ON Q21.Copmany=Holding.Company
例子3:连接相关过滤
如果连接节点的输出流为Q22,则与从该连接输出的顾客字段有关的节点23的过滤器表示为
SELECT*
FORM Q22
WHERE Customer=“C2”
例子4:计算
每一交易的全部值可以由以下计算
SELECT*,Price*Quantity AS TotalValue
FROM Q22
例子5:负过滤(差)
订购者不希望看到关于当地警方禁止其股份的公司的股票信息。这种公司的一个列表保留在数据库的被禁止的关系中。按SQL定义作出一订购:
SELECT*
FROM Stock
WHERE Company NOT IN
(SELECT Company FROM Proscribed)
例子6:档案
管理员通过向关系插入输入流股票的消息元组建立标有日期的档案。
INSERT INTO StockArchive
SELECT*,Time()as TimeAudit
FROM Stock
例子7:更新
管理员希望在数据库表StockLatest中保持对每一公司最近价格的跟踪。
UPDATE StockLatest INNER JOIN Stock
ON StockLatest.Company=Stock.Company
SET StockLatest.Price=Stock.price,StockLatest.LogTime=Now();
例子8:复合表达式
SQL允许把几个计算组合为单一表达式。以下的表达式组合了连接、过滤器和计算。
SELECT Q21.*,Customer,Quantity,Price*Quantity as TotalValue
FROM Q21 INNER JOIN Holding
ON Q21.Company=Holding.Company
WHRER Customer=’C2’
一旦指定了代理系统,就很容易作出改变,以便添加附加的功能。例如,计算节点24(如图3中所示)能够被添加在连接节点22的输出,使得所得的消息将包含另一字段,即每一顾客在相关公司中的股票拥有权的当前总值。这就是说,计算节点24将使股价乘以顾客具有的股票数,并在分开的字段(称为“总值”)提供该乘积。于是,表3现在将变为:
表4
公司 价格 顾客 数量 总值
IBM 160 C3 77 12,320
IBM 160 C2 44 7,040
Ford 44 C3 120 5,280
通过修改定义节点功能的关系表达式易于对现有的节点(例如,22)作出改变。由于连接节点22和过滤器节点21及23都是无缝集成到互连节点的网络中的,使消息元组流在节点之间通过,故任何节点的关系表达式易于以统一的方式被修改。对任何节点没有必要切换到不同类型的编程过程(如以上所讨论的现有技术那样)。
由于代理的功能是以数据库专用术语实现的,故使用对关系数据库管理系统编程可得的标准的可视化工具,对代理13的功能单元作出改变则成为很容易的事情。关系数据库程序员已经熟悉这些工具。因而,数据库程序员将发现易于建立代理13的节点(例如21,22,23)的结构。例如,如果应顾客的请求,必须对连接节点作出改变,则这能够易于由数据库程序员进行而无需学习新的编程技术,这样大大降低了系统的开发费用。
虽然在优选实施例中每一节点是由关系表达式定义的,但一些节点也可以以其它方式实现,当然这种情形下降低了本发明的好处。
以上说明了本发明的优选实施例关系消息代理的添加值发布/订购应用,这是对本发明很有用的一个环境。然而,有很多本发明有用的其它环境,包括工作流程流,其中视这时哪个接收者不忙传输的消息可以指向任何多个接收者。在工作流环境中,代理将访问数据库14,以便确定关于每一接收者的数据,以作出关于应向哪一接收者分配工作请求消息的决定。
本发明的一个实施例在与因特网连接的服务器计算机上提供了关系消息代理功能,使得发布者和订购者应用能够作为客户通过万维网浏览器应用程序访问因特网服务器。这样,当这样发布的消息与订购者较早指定的标准匹配时(又是使用万维网浏览器应用程序与因特网服务器接触),代理13将把发布的消息通过因特网推向订购者15的万维网浏览器应用程序。