iknewyouweretrouble:SOA--ESB的消息交换模式(MEP)

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 20:36:41

服务的工作方式是在服务供应者和消费者之间发送消息。在不同通信层上存着许多消息交换模式(MEP Message Exchange Patterns),其中一个模式带来了事件以及事件驱动的架构。(EDA

基本MEP

请求/应答 

这也许是对于SOA来说,最重要的模式了。这种模式下,消费者向供应者发出一个请求消息,等待供应者发出应答消息。

 

      这有点像RPC(远程过程调用),这也意味着,知道应用程序达到之前,消费者都被阻塞。它的优点是:处理代码简单。处理一个服务调用与处理任何其他函数或过程调用一样;缺点是:等待应答时,无法做其他任何事情。 

     如果供应者不可用,或者出现错误,消费者可能无法得到答案,结果永远停留在阻塞状态。这可以引入定时器,如果在给定时间内没有应答,则开始某种异常处理。

另外还有一种“异步”的请求/应答模式。称为:请求/回调模式。 

单程

这是种不需要应答的模式,只需要发送消息。 请求/应答对比两个单程消息

如果需要应答才能继续工作,那么可能就需要请求/应答模式;如果需要应答,但是可以在没有应答的情况下继续工作,那么可以把应答消息想象成另一个服务请求,该请求将回头来针对发起第一个请求的系统,也就是使用两个单程消息。

单程消息的最大优点是没有哪个过程被阻塞。也就是说,消费者和供应者没有必要同时可用。更进一步的,你可以在基础设施(ESB)中插入消息队列,这样一来,消息一旦被持久化,不会丢失。这也是诸如MQJMS这些“面向消息的中间件”(MOM)的核心所在。

请求/应答消息模式的优点是,应答被递交到触发最初请求的同一个流程实例。(如果不要求同一个实例,则使用两个单程消息更好)如果基础设施不支持请求/应答模式,那么就必须自己编程,使请求方找到正确的实例来提交应答。这种情况下,通常的做法是,消费者发送一个内部的“返回地址”,供应者将其和应答消息一起发送。处理收到应答消息的消费者进程/线程可以用这个地址,在内部将应答路由到正确的实例。 

更复杂的EMP

请求/回调

通常,一个进程/线程需要某些数据或对某些操作的确认,但是,不一定非得在应答到来前阻塞该进程/线程。这种模式可以叫非阻塞请求/应答/异步请求/应答。或者请求/回调

这样的场景,消费者的API从概念上按如下方式工作:消费者发起一个请求,指明当回答到达时采取怎样的动作。技术上,消费者可以定义一个所谓的“回调函数”,这是个当应答到来时被调用的函数/例程。 

他复杂的地方在于:

l 如果发送了多个请求/毁掉消息,那么应答的顺序可能不同,必须把应答和当初请求相匹配。通常,靠引入关联ID来做到这点。关联ID和请求一个发送,并和请求一起发送回来。

l 必须保证每个应答的上下文环境仍然有效,仍然包含了素有要用来处理应答的消息。

l 对于没收到应答的请求,应作出恰当的反映。(靠某种最大相应期限) 

他的优点在于:

引入了一种形式的松耦合,请求被发送时,服务供应者不必处于可用状态,并且,在等待应答时,消费者可以继续工作。

每个方法都有长处和短处,这里考虑的因素可能包括运行时间/资源可用性/可靠性/以及维护性等。异步更难维护,但是同步也可能造成时间的浪费。再次注意,如果应答不一定费用递送到发出请求的同一个进程/线程,则使用两个单程消息可能更好。 

发布/订阅

有是,发送的是不要求回复的单程消息。发送这样的消息是通知其他系统。比如,规定某条件出现时,一个系统必须通知另一个特定系统。或者另一个著名的模式是使一个系统向特定的通知或事件进行注册或订阅,称为“观察者”或“发布/订阅”模式。 

不同的MEP

消息交换模式永远都依赖于传输层或消息所使用协议的特性。看下面的例子,即使传输层不可靠,仍然可以提供一个有可靠接口的API

上图中,请求消息丢了,然后应答丢了,最后才成功。这是支持同步请求/应答MEPAPI,然而,最底层协议是一系列请求/回调MEP。注意,协议本身也可以使用其他MEP,如单程消息来处理内部通信。

SOA角度看,如果ESB是协议驱动的,则消费者可能需要复杂重试这些东西,如果ESBAPI驱动的,那么基础设施团队就应该负责为不同的MEP提供API。后一种情况,可能还需要指定重复次数,两次重试之间的超长时间等等。

另外一种情况是,可能应答消耗的时间太多,导致发出了一个重试。这样,消费者就要处理多重应答。 

这里第一个请求消息丢失了,于是发送了一个重试。重试成功,但是,因为结果到达用了太长时间,发出了第二个重试消息,这个消息由服务供应者的另一个线程处理。因此,消费者最终得到了两个应答。这里的幂等性成为主要的问题。 总结: 1.服务使用不同的消息交换模式(MEP),这些消息交换定义了完成特定服务操作完成页顶服务操作所需要发送的消息的次序、方向和个数。2.基本MEP是请求/应答和单程。同样重要的还有请求/回调、发布/订阅,以及安排错误处理的更高层的模式3.MEP和特定的层相关。对SOA来说,协议层和API层的MEP最重要4.事件是一种特殊类型的单程消息。事件带来事件驱动的架构(EDA),这可以被认为是一种特殊情况的SOA,或是对SOA的补充5.单程消息和事件带来(业务)流程链,这是实现业务流程的另一种方式。不同于对整个流程拥有一个中央控制器的配置型服务,你得到的是编排型的服务,因为,每个服务将触发业务流程的下一步骤。