论文部分内容阅读
摘要:CORBA的通知服务相对于传统的事件服务,增加了一系列新的特性,对海量教育资源信息的订阅发布提供了更大的灵活性和通用性。文章根据通知服务原理,构建了一个资源订阅系统模型,用户可以订阅感兴趣的信息,事件通知服务负责发布事件,同时将事件分发给感兴趣的订阅者。模型采用事件过滤机制、分组共享、队列优先级设计,提高了事件通知的可靠性。
关键词:事件通知服务;发布/订阅;事件过滤;事件通道
0 引言
分布式应用借助中间件实现了资源共享、功能共享的目的。CORBA(The Common Object Request Broker,公共对象请求代理)技术通过ORB(Object Request Broker,对象请求代理)把分布的对象连成一个逻辑上统一的整体,对分布式数据提供统一的访问机制。网络教育资源是运行在互联网上的数字资源库,随着资源库信息内容的不断扩大,在这个海量信息库中搜索、浏览、跟踪、订阅信息变得越来越困难。因此,可为用户订阅感兴趣的信息,当有新信息时,能主动通知对这些信息感兴趣的用户的系统,能为用户提供更好的服务,加速海量信息的利用。这种系统设计的关键技术是事件通知服务。
1 事件通知服务结构及功能
事件服务体现在CORBA服务器端的ORB中,它为客户端程序和服务端实现的对象提供事件通道、事件代理,并实现客户端程序和服务端对象之间的事件数据的推拉。事件通道可以支持多个消费者和多个供应者,支持多对多通信。其中消费方可以请求一个事件,也可以只是接收一个关于事件的通知。供应方可以通过发布一个单独的标准的请求与消费方快速地建立联系来进行事件通信。产生事件的供应方不必知道消费方的身份,同样接收事件的消费者也不需要知道供应者的身份。事件本身不是一个对象。但事件通道是一个对象,通过事件通道可以让多个供应者和多个消费者进行异步的通信,事件通道本身既充当一个事件的消费者也充当该事件的供应者。事件通道是标准的CORBA对象,通过使用标准的CORBA请求来完成通信。事件服务可以用于提供一个“变化通知”,当某个对象发生改变时(例如它的状态被修改),将产生一个事件并被广播到对该事件感兴趣的一方。在这里,发生了改变的对象扮演了供应方,接收到通知的一方扮演了消费方,而事件通道对象则充当了消费方和供应方的中介。通知服务的结构模型如图1所示。
图1 通知服务结构模型
OMG的事件服务支持二种类型的事件通信:unTyped和Typed类型。对unTyped事件类型通信,它将所有事件转换成anys格式。但许多应用程序需要更强壮的自定义类型事件信息,为适应这种需求,OMG的事件服务定义了接口和便于支持typed的事件通道。但这种typed难以理解和实现,因为这个原因,CORBA通知服务引进了一个新的事件信息structuredEvent。在通知服务中结构体事件能被直接传输,不需要打包成Any类型。
通知服务支持三种事件类型:Any、Structured Event、TypedEvent,这三种事件类型可在通道中转换。它比OMG的事件服务提供了更广范围的应用,且在性能、Qos(Quality of Service:服务质量)方面更胜一筹。
CORBA的事件通知服务规范扩展了OMG的事件服务,添加了如下的新特性:
(1)可以以明确定义数据结构的形式传输事件,增加了Anys类型和自定义事件类型的事件服务。
(2)通过对通道中的每一个代理添加过滤器,客户端可以明确指定要接收的事件类型。
(3)供应者能发现通道中客户需求事件,按需提供事件,避免传送客户不需要的事件。
(4)可以对每个通道、每个代理、每个事件配置不同质量的服务。
(5)终端用户可使用现存的方便的过滤器构造流经通道的事件结构。
通知服务支持明确定义的工厂接口。事件通道工厂用于创建通知通道新的实例,创建时客户端可指定通道支持的各种Qos和管理属性。通道中设置的标准的管理属性主要包括:通道中最大事件数、最大队列长度、最大数量的消费者和供应者。
事件通道工厂是通知服务中的一个被明确定义成工厂的接口,它产生出自然被继承的服务体系,例如事件通道工厂创建事件通道对象。事件通道对象本质上也是一个工厂,能创建管理者,而代理对象则由管理者创建。对象的识别标志由所创建对象的对象分配,是惟一的。通道中所有对象能得到子对象的引用外,还可对父亲对象反向引用。这种设计原则大大提高了通知服务事件通道的管理能力,使任何一个通道的客户端都能发现所有兼容通道中的对象,并启动通道内的任一对象。
每一个管理接口实质上也是一个工厂,能创建代理接口。管理对象有自己的Qos和过滤器对象,每一个代理对象继承了创建自己的管理对象的Qos特性,与管理对象关联的过滤器对象的设置也自动地与该管理对象所创建的所有代理关联,每一个管理对象所创建的所有代理对象间共享一个过滤器对象的设置。这种共享过滤器的设置为一组客户进行事件共享、事件订阅提供了强大的机制,使得根据订阅信息对代理对象进行分组成为可能。这个特点对ConsumerAdmin对象特别有用,因为它能对一组接收同样事件设置有兴趣的客户进行优化服务。
通知服务类型的代理对象能将信息区分成Any事件、结构体事件、结构体事件序列三种事件格式进行收发。
通知服务类型的代理对象有两种不同类型的过滤器:运送过滤器(Forwording Filters)、映射过滤器(Mapping Filters)。运送过滤器可加到所有类型的代理对象中,并包含代理要运送的事件;映射过滤器只附加到供应商代理对象,并只对供应商代理接收的事件的优先级或生命周期属性有效。这两种类型的过滤器可显式或隐式分配到代理对象中。
在不改变通知服务的接口下,可添加新的Qos和管理属性,新添加部分看作是接口的扩展而不是修改。
2 基于通知服务的资源订阅系统设计
在网络教育资源系统设计中,考虑到有海量的信息资源的共享,所面向的用户也是有相当规模的,因此事件通知的服务设计成多个事件代理组成的分布式系统。每一个供应者代理对应一个过滤器,事件服务可有多个消费者和多个供应者。事件通知服务模型如图2所示。
图2 事件通知服务模式
在分布式环境下,CORBA的通知服务支持事件共享、事件订阅功能。在网络教育资源管理系统中,信息内容可按主题、内容、作者等进行分类,用户可根据主题或内容等分类方式订阅需求信息,系统还可对订阅同一信息的用户进行分组管理。图3为按主题内容的发布订阅模型。
图3 事件的订阅与发布
图3表示事件的发布与接收情况。e1、e2是发布者发布的 事件,订阅者l订阅信息s1,订阅者2订阅信息s2,事务通知服务分别将订阅信息和发布事件匹配,最后将el发送给订阅者1,将e1、e2发送给订阅者2。
2.1分组订阅机制
在图2所示的系统中,建立了一个分组管理机制,在通道与客户间共享订阅,对不同的订阅信息分配不同的事件优先权,对一定范围的优先权事件进行分组管理,同一组的订阅消费者分享同一个线程,同一个过滤器,以节省系统资源。
事件供应者提供事件类型,消费者可以根据提供的事件类型信息(咨询事件类型库)查找事件包含的属性名和类型,然后填写订阅单。消费者也可使用obtain-offered-types操作(在供应者代理接口)查找当前通道中提供的事件类型的设置。事件通道集合消费者所需的事件类型,调用Subscription-change变更订阅。供应者也可在ProxyConsumer接口调用obtain-subscription-types获得通道中消费者所需的事件类型。
NotifySubscribe提供订阅变更操作接口,它支持所有供应者代理接口和ConsumerAdmin接口,也支持事件的供应者。
2.2事件过滤机制
在通知服务事件通道内的每一个管理和代理对象都可与一个或更多个过滤器对象关联。这些过滤器对象可根据不同的Qos需求被重定义在通知服务事件通道的同一服务器进程,或重新驻留在他们自己的地址空间里。
在通知服务中过滤器对象用管理接口,管理一个或多个代理对象。每一个代理实质上有两种过滤器:一是与管理对象关联的过滤器,另一是直接与自己关联的过滤器。创建管理对象时,决定由它所创建的代理对象是否应用两套过滤器。如果一个代理既不与管理对象关联,也不与它自己的过滤器管理接口关联,则它将传送所有接收到的事件。
代理对象每接收一个事件,过滤器被激发并执行过滤操作。每接收一个事件时,通道内的代理对象会激发一个最接近的匹配操作,被过滤的事件目录作为输入。激发的匹配操作如下:
boolean match(in any filterable_data);
boolean match_sturcturedfin CosNotification::Structured
Event filterable_data);
boolean match_typed(in CosNotification::PropertySeq
fiIterable_data):
以上操作的结果是一个布尔值,当过滤对象封装了一个或多个合适的结果时返回true,否则返回false。如果代理有多个过滤器对象关联,则它将激发每一个关联的过滤器对象,直到有一个返回true,或所有都为false。当所有匹配结果都为false时,代理将放弃事件。否则事件将提取给代理(当过滤器被消费者代理执行时,事件提取给供应者代理,当过滤器被供应者代理执行时,事件被提取给消费者)。如果代理还有其它事件等待传送,当前事件被放入队列,等待传送,否则事件被马上传送。
2.3事件的优先级设置
每一事件有两个特殊属性:优先级和生命周期。为了使消费者能有效获得事件的优先权和生命周期属性,通知服务方引进了过滤器对象的映射概念。每一个过滤器对象能封装一个或更多个对,并有一个默认值关联。根据映射过滤器中的优先属性,供应者代理激发映射过滤器的最接近的匹配操作。每一个供应者代理可与一个映射过滤器关联,能影响它所接收事件的优先权属性。每一个映射过滤器能封装一个或多个constraint-value对,并有一个默认值与它关联。当有优先级关联时,供应者代理将遵循下列规则:当有优先属性关联时,使用这个值,否则查看是否有通过代理对象继承的相关的优先属性可用,如果都没有可用的优先值,则输出参数返回匹配的操作。映射过滤器接口定义如下:
interface Mapping Filter{
readonly attribute string constraint_grammar;
readonly attribute CORBA::TypeCode Value_type;
readonly attribute any default_Value;…};
优先变量priority为属于short类型,默认的优先值为0。事件分发的模式,设置为PriorityOrder时,则通道按优先权值序列传送信息给消费者。
2.4队列优先级
事件的分发有四种模式:按事件接收次序先接收的先分发,按事件接收次序先接收的后分发,按事件优先级次序分发,实时分发。按事件优先级次序进行分发的情况下,若有新事件到来,则依次和队列中的每个事件的优先级进行比较来决定插入位置。这样新生成的队列仍然严格按优先级高低排序。
为确保不同的优先级事件进入不同的队列,并保证优先级高的事件首先被发送,可对每个供应者代理建立和最大优先级数目相同的队列。
const sting MaxQueueLength=“MaxQueueLength”:
当供应者发出信息传输请求时,服务器将派生一个线程将事件送入事件通道,由该通道创建消费者管理对象,再由消费者管理对象创建供应者代理,将事件存放进供应者事件队列中。另一个等待的线程负责从事件队列中取出事件,将其分发给不同的订阅消费者。在此过程中,流经管理对象和代理对象的事件传送请求都将得到优先响应。
3 结束语
事件通知服务在分布式系统应用中有很大的优势。在教育资源的订阅中,根据用户订阅信息进行点对点的消息发送,减少了网络流量,为订阅系统提供了更高的灵活性和可靠性。本文利用事件过滤机制和分组共享机制对事件通道进行优化,提高了事件服务的可靠性。
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
关键词:事件通知服务;发布/订阅;事件过滤;事件通道
0 引言
分布式应用借助中间件实现了资源共享、功能共享的目的。CORBA(The Common Object Request Broker,公共对象请求代理)技术通过ORB(Object Request Broker,对象请求代理)把分布的对象连成一个逻辑上统一的整体,对分布式数据提供统一的访问机制。网络教育资源是运行在互联网上的数字资源库,随着资源库信息内容的不断扩大,在这个海量信息库中搜索、浏览、跟踪、订阅信息变得越来越困难。因此,可为用户订阅感兴趣的信息,当有新信息时,能主动通知对这些信息感兴趣的用户的系统,能为用户提供更好的服务,加速海量信息的利用。这种系统设计的关键技术是事件通知服务。
1 事件通知服务结构及功能
事件服务体现在CORBA服务器端的ORB中,它为客户端程序和服务端实现的对象提供事件通道、事件代理,并实现客户端程序和服务端对象之间的事件数据的推拉。事件通道可以支持多个消费者和多个供应者,支持多对多通信。其中消费方可以请求一个事件,也可以只是接收一个关于事件的通知。供应方可以通过发布一个单独的标准的请求与消费方快速地建立联系来进行事件通信。产生事件的供应方不必知道消费方的身份,同样接收事件的消费者也不需要知道供应者的身份。事件本身不是一个对象。但事件通道是一个对象,通过事件通道可以让多个供应者和多个消费者进行异步的通信,事件通道本身既充当一个事件的消费者也充当该事件的供应者。事件通道是标准的CORBA对象,通过使用标准的CORBA请求来完成通信。事件服务可以用于提供一个“变化通知”,当某个对象发生改变时(例如它的状态被修改),将产生一个事件并被广播到对该事件感兴趣的一方。在这里,发生了改变的对象扮演了供应方,接收到通知的一方扮演了消费方,而事件通道对象则充当了消费方和供应方的中介。通知服务的结构模型如图1所示。
图1 通知服务结构模型
OMG的事件服务支持二种类型的事件通信:unTyped和Typed类型。对unTyped事件类型通信,它将所有事件转换成anys格式。但许多应用程序需要更强壮的自定义类型事件信息,为适应这种需求,OMG的事件服务定义了接口和便于支持typed的事件通道。但这种typed难以理解和实现,因为这个原因,CORBA通知服务引进了一个新的事件信息structuredEvent。在通知服务中结构体事件能被直接传输,不需要打包成Any类型。
通知服务支持三种事件类型:Any、Structured Event、TypedEvent,这三种事件类型可在通道中转换。它比OMG的事件服务提供了更广范围的应用,且在性能、Qos(Quality of Service:服务质量)方面更胜一筹。
CORBA的事件通知服务规范扩展了OMG的事件服务,添加了如下的新特性:
(1)可以以明确定义数据结构的形式传输事件,增加了Anys类型和自定义事件类型的事件服务。
(2)通过对通道中的每一个代理添加过滤器,客户端可以明确指定要接收的事件类型。
(3)供应者能发现通道中客户需求事件,按需提供事件,避免传送客户不需要的事件。
(4)可以对每个通道、每个代理、每个事件配置不同质量的服务。
(5)终端用户可使用现存的方便的过滤器构造流经通道的事件结构。
通知服务支持明确定义的工厂接口。事件通道工厂用于创建通知通道新的实例,创建时客户端可指定通道支持的各种Qos和管理属性。通道中设置的标准的管理属性主要包括:通道中最大事件数、最大队列长度、最大数量的消费者和供应者。
事件通道工厂是通知服务中的一个被明确定义成工厂的接口,它产生出自然被继承的服务体系,例如事件通道工厂创建事件通道对象。事件通道对象本质上也是一个工厂,能创建管理者,而代理对象则由管理者创建。对象的识别标志由所创建对象的对象分配,是惟一的。通道中所有对象能得到子对象的引用外,还可对父亲对象反向引用。这种设计原则大大提高了通知服务事件通道的管理能力,使任何一个通道的客户端都能发现所有兼容通道中的对象,并启动通道内的任一对象。
每一个管理接口实质上也是一个工厂,能创建代理接口。管理对象有自己的Qos和过滤器对象,每一个代理对象继承了创建自己的管理对象的Qos特性,与管理对象关联的过滤器对象的设置也自动地与该管理对象所创建的所有代理关联,每一个管理对象所创建的所有代理对象间共享一个过滤器对象的设置。这种共享过滤器的设置为一组客户进行事件共享、事件订阅提供了强大的机制,使得根据订阅信息对代理对象进行分组成为可能。这个特点对ConsumerAdmin对象特别有用,因为它能对一组接收同样事件设置有兴趣的客户进行优化服务。
通知服务类型的代理对象能将信息区分成Any事件、结构体事件、结构体事件序列三种事件格式进行收发。
通知服务类型的代理对象有两种不同类型的过滤器:运送过滤器(Forwording Filters)、映射过滤器(Mapping Filters)。运送过滤器可加到所有类型的代理对象中,并包含代理要运送的事件;映射过滤器只附加到供应商代理对象,并只对供应商代理接收的事件的优先级或生命周期属性有效。这两种类型的过滤器可显式或隐式分配到代理对象中。
在不改变通知服务的接口下,可添加新的Qos和管理属性,新添加部分看作是接口的扩展而不是修改。
2 基于通知服务的资源订阅系统设计
在网络教育资源系统设计中,考虑到有海量的信息资源的共享,所面向的用户也是有相当规模的,因此事件通知的服务设计成多个事件代理组成的分布式系统。每一个供应者代理对应一个过滤器,事件服务可有多个消费者和多个供应者。事件通知服务模型如图2所示。
图2 事件通知服务模式
在分布式环境下,CORBA的通知服务支持事件共享、事件订阅功能。在网络教育资源管理系统中,信息内容可按主题、内容、作者等进行分类,用户可根据主题或内容等分类方式订阅需求信息,系统还可对订阅同一信息的用户进行分组管理。图3为按主题内容的发布订阅模型。
图3 事件的订阅与发布
图3表示事件的发布与接收情况。e1、e2是发布者发布的 事件,订阅者l订阅信息s1,订阅者2订阅信息s2,事务通知服务分别将订阅信息和发布事件匹配,最后将el发送给订阅者1,将e1、e2发送给订阅者2。
2.1分组订阅机制
在图2所示的系统中,建立了一个分组管理机制,在通道与客户间共享订阅,对不同的订阅信息分配不同的事件优先权,对一定范围的优先权事件进行分组管理,同一组的订阅消费者分享同一个线程,同一个过滤器,以节省系统资源。
事件供应者提供事件类型,消费者可以根据提供的事件类型信息(咨询事件类型库)查找事件包含的属性名和类型,然后填写订阅单。消费者也可使用obtain-offered-types操作(在供应者代理接口)查找当前通道中提供的事件类型的设置。事件通道集合消费者所需的事件类型,调用Subscription-change变更订阅。供应者也可在ProxyConsumer接口调用obtain-subscription-types获得通道中消费者所需的事件类型。
NotifySubscribe提供订阅变更操作接口,它支持所有供应者代理接口和ConsumerAdmin接口,也支持事件的供应者。
2.2事件过滤机制
在通知服务事件通道内的每一个管理和代理对象都可与一个或更多个过滤器对象关联。这些过滤器对象可根据不同的Qos需求被重定义在通知服务事件通道的同一服务器进程,或重新驻留在他们自己的地址空间里。
在通知服务中过滤器对象用管理接口,管理一个或多个代理对象。每一个代理实质上有两种过滤器:一是与管理对象关联的过滤器,另一是直接与自己关联的过滤器。创建管理对象时,决定由它所创建的代理对象是否应用两套过滤器。如果一个代理既不与管理对象关联,也不与它自己的过滤器管理接口关联,则它将传送所有接收到的事件。
代理对象每接收一个事件,过滤器被激发并执行过滤操作。每接收一个事件时,通道内的代理对象会激发一个最接近的匹配操作,被过滤的事件目录作为输入。激发的匹配操作如下:
boolean match(in any filterable_data);
boolean match_sturcturedfin CosNotification::Structured
Event filterable_data);
boolean match_typed(in CosNotification::PropertySeq
fiIterable_data):
以上操作的结果是一个布尔值,当过滤对象封装了一个或多个合适的结果时返回true,否则返回false。如果代理有多个过滤器对象关联,则它将激发每一个关联的过滤器对象,直到有一个返回true,或所有都为false。当所有匹配结果都为false时,代理将放弃事件。否则事件将提取给代理(当过滤器被消费者代理执行时,事件提取给供应者代理,当过滤器被供应者代理执行时,事件被提取给消费者)。如果代理还有其它事件等待传送,当前事件被放入队列,等待传送,否则事件被马上传送。
2.3事件的优先级设置
每一事件有两个特殊属性:优先级和生命周期。为了使消费者能有效获得事件的优先权和生命周期属性,通知服务方引进了过滤器对象的映射概念。每一个过滤器对象能封装一个或更多个对,并有一个默认值关联。根据映射过滤器中的优先属性,供应者代理激发映射过滤器的最接近的匹配操作。每一个供应者代理可与一个映射过滤器关联,能影响它所接收事件的优先权属性。每一个映射过滤器能封装一个或多个constraint-value对,并有一个默认值与它关联。当有优先级关联时,供应者代理将遵循下列规则:当有优先属性关联时,使用这个值,否则查看是否有通过代理对象继承的相关的优先属性可用,如果都没有可用的优先值,则输出参数返回匹配的操作。映射过滤器接口定义如下:
interface Mapping Filter{
readonly attribute string constraint_grammar;
readonly attribute CORBA::TypeCode Value_type;
readonly attribute any default_Value;…};
优先变量priority为属于short类型,默认的优先值为0。事件分发的模式,设置为PriorityOrder时,则通道按优先权值序列传送信息给消费者。
2.4队列优先级
事件的分发有四种模式:按事件接收次序先接收的先分发,按事件接收次序先接收的后分发,按事件优先级次序分发,实时分发。按事件优先级次序进行分发的情况下,若有新事件到来,则依次和队列中的每个事件的优先级进行比较来决定插入位置。这样新生成的队列仍然严格按优先级高低排序。
为确保不同的优先级事件进入不同的队列,并保证优先级高的事件首先被发送,可对每个供应者代理建立和最大优先级数目相同的队列。
const sting MaxQueueLength=“MaxQueueLength”:
当供应者发出信息传输请求时,服务器将派生一个线程将事件送入事件通道,由该通道创建消费者管理对象,再由消费者管理对象创建供应者代理,将事件存放进供应者事件队列中。另一个等待的线程负责从事件队列中取出事件,将其分发给不同的订阅消费者。在此过程中,流经管理对象和代理对象的事件传送请求都将得到优先响应。
3 结束语
事件通知服务在分布式系统应用中有很大的优势。在教育资源的订阅中,根据用户订阅信息进行点对点的消息发送,减少了网络流量,为订阅系统提供了更高的灵活性和可靠性。本文利用事件过滤机制和分组共享机制对事件通道进行优化,提高了事件服务的可靠性。
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。