SCA 的新规范,事件处理和 Pub/Sub 的装配模型扩展规范,描述了 SCA 装配模型对事件处理和 Pub/Sub 的扩展,它们完成:
- 事件处理,负责执行对事件的操作,包括创建、读取、转换和删除事件或事件对象 / 表示。事件处理组件之间的交互是通过创建要发送的事件消息完成的。此外,事件处理组件可以使用 SCA 的常规服务响应机制跟其他 SCA 组件进行交互。
- 发布和订阅(通常简写为 Pub/Sub),是一种特殊的组织事件产生组件和事件消费组件的风格,其中分离了生产组件跟消费组件之间的耦合。想要消费事件的组件是通过订阅而不是通过接口来指定它们的关注点。相同事件可被多个订阅者接收。
事件处理的引入提供了一种比使用服务接口耦合更松的组件组合方法。事件对于通信两端的组件,强制性的要求要少得多。从效果上上来看,在事件处理过程中,只有事件类型才需要在生产者和消费者之间共享。更松的耦合可以通过 Pub/Sub 的使用实现。在这种情况下,生产者并不直接跟任何消费者相连;相反,生产者通过一个逻辑中介(Pub/Sub 引擎)跟消费者连接。
在 SCA 中,事件生产者能够通过一个被称为通道(channel)的第三方组件跟事件消费者链接起来,其中,在生产者中将通道配置成目标(target),而在消费者中通道则被配置成源(source)。通过设置目标属性中的目标 URI 列表,生产者声明了所生产消息要发往的目的地。通过设置源属性中的源 URI 列表,消费者声明了所接收消息的来源。
通道是 SCA 的一个新制品,用它可将一组事件生产者和一组事件消费者连接起来。通道可以接收由多个生产者发送的事件,也可以将所有这些事件发送给订阅该通道的每个消费者。通道的存在独立于任何生产者或消费者。通道就好像是一个名字为“in”的消费者,生产者可以向它发送事件。同时,通道又充当了一个名字为“out”的生产者,消费者可以从它接收事件。通道还能被配置成过滤器,它定义了通道希望接收的事件集合。倘若事件不符合过滤器定义的条件,该事件就会被丢弃。
通道或者存在于域(domain)级别,或者存在于作为构件(composite)使用的实现中。域级别的通道能够作为位于任意构件层级内部的生产者的目标。它们也能作为位于任意构件层级内部的消费者的源。在作为构件使用的实现内部,通道是这个构件的私有通道。这些私有通道仅能作为在同一构件内部的生产者的目标,以及同一构件内部的消费者的源。
这种对通道所进行地全局和私有划分可以让装配者视需要来控制解决方案内参与事件变化的组件集合。从效果上讲,全局通道的生产者和消费者是无法控制的——它们存在于域级别,它们随时可以通过部署动作被添加和删除。私有通道的生产者和消费者集合则是受限的——这些集合在构件容器创建时由装配者决定。
为了支持按组件去消费和生产消息,可以通过往组件定义中添加消费者和生产者标签来实现。组件元素可以有零个或多个消费者子元素,它们配置了组件的消费者。实现定义了能够配置的消费者。组件元素也可以有零个或多个生产者元素作为子元素,它们用于配置组件的生产者。能够配置的生产者同样也是由实现定义的。
SCA 中的事件有一个事件类型与之关联。每个事件类型都由一个唯一的事件类型名称来定义。事件可以没有事件类型元数据与之关联——比如,有可能出现这种情况:事件是由现有非 SCA 事件源创建的。SCA 有一个用 XML 描述的规范事件类型表示,以及用 XML 模式描述的规范事件结构(event shape)表示。SCA 事件结构可以使用 XML 信息集进行描述,尽管它们不必非得用 XML 模式来描述,还有其他的类型系统可以用。SCA 事件可以有一个非 XML 的连线格式(wire format)。事件还能用特定编程语言描述。语言特定的格式和 XML 之间的映射细节在 SCA 实现语言规范中有定义。
随着 SOA 和 EDA 的不断融合,在 SCA 中引入对事件的支持,巩固了其作为 SOA 编程模型中头把交椅的位置。
评论