在ESB中另外一个重要的课题就是Message Endpoint,这是关于一个应用程序如何连接到一个消息系统,并通过它来发送和接收消息。如果你在面向一个消息API编程,则你就正在开发一个endpoint代码。商业中间件通常都提供了这些工具。
<!----><o:p> </o:p>
l Messaging Gateway
l Messaging Mapper
l Transactional Client
l Polling Consumer
l Event-Driven Consumer
l Competing Consumers
l Message Dispatcher
l Selective Consumer
l Durable Subscriber
l Idempotent Receiver
l Service Activator
<o:p> </o:p>
发送和接收模式<o:p></o:p>
<o:p> </o:p>
有些endpoint模式既可以使用在发送方也可以使用在接受方。它们描述一个应用连接一个消息系统的一般情况。
<o:p> </o:p>
包装消息代码 - 一个应用不应该意识到正在使用消息同另外一个应用程序通讯,大多数应用代码应该在不知道message的情况下被编写。在应用集成的地方,应该有一个薄薄的一层代码来执行应用的集成部分。当集成是由消息实现的,这层将应用连接到消息系统的代码称为一个Message Gateway
<o:p> </o:p>
数据转换 - 当发送者和接受者使用不同的数据格式,或者不同的消息格式(支持不同的发送和接收者),在这种情况下,使用一个Message Mapper来在应用格式和消息格式之间转换数据。
<o:p> </o:p>
外部控制的事务 - 消息系统在内部和外部使用事务,默认的,每个发送和接收方法在他们自己的事务中运行。Message生产者和消费者应可选的使用一个Transactional Client来控制事务,当你需要将几个消息一起发送伙通过其他事务服务整理消息时是很有用的。
<o:p> </o:p>
消息消费者模式<o:p></o:p>
<o:p> </o:p>
其他endpoint模式只适用于消息消费者,发送消息是简单的。棘手的问题是决定一个消息应该何时发送,它应包含什么,以及怎样将它送到接受者 - 这是为什么我们有很多消息结构模式 - 但是一旦消息被构建,发送它是很容易的。另一方面,接收消息 - 很麻烦。因此许多endpoint模式是关于接收消息的。
<o:p> </o:p>
接收消息的一个最重要的主题就是流量控制:一个应用控制,或者调节它消费消息的速度。一个潜在的问题是任何server都面临着大量的客户端请求会使其超载。通过远程过程调用(RPI),server几乎受到客户端调用的支配。同样的,通过消息,server不能控制客户端发送请求的速度 - 但是server可是控制它处理这些请求的速度。应用不必像消息系统传送消息那么快的接收并处理消息;使用一个Message Channel可以使它在一个可接收的速率上处理消息。然而,当消息积累太多,而server还有资源可以处理的更快,它可以使用同步message消费者来加快速度。所以使用这些消息消费者模式可以让你的应用将速度控制在它可以承受的范围。
<o:p> </o:p>
许多消息消费者模式都是成对出现的,你可以任选一个使用。
<o:p> </o:p>
同步或异步接受者 - 可以使用轮询消费者或一个事件驱动消费者。轮询提供最好的流量控制,因为如果server忙,则它不再继续轮询消息,所以message将阻塞在队列。事件驱动的消费者倾向于消息到达便触发处理,所以有可能会使server超载,但是每个消费者每次只处理一个消息,所以限制消费者的数量可以有效的控制消费速度。
<o:p> </o:p>
消息分派 vs 消息获取 - 另外一个二选一的模式是一堆消费者如何处理一堆消息。如果每个消费者获得一个消息,他们可以并行的处理消息。最简单的方法是Competing Consumers,也就是一个点对点的channel有多个消费者。每个都可能获得任何消息;消息系统的实现决定那个消费者获得消息。如果你想控制消息到消费者的匹配过程,使用Message Dispatcher。这时只有一个消费者接收消息,但是将委派消息到一个执行者去处理。一个应用程序可以通过限制消费者或执行者的数量来控制流量。当然,分派者Message Dispatcher也可以实现一个流量控制行为。
<o:p> </o:p>
接收所有消息或者过滤 - 默认的,任何到达一个Message Channel的消息对于监听着这个channel的Message Endpoint都是可用的。然而有些消费者并不打算处理channel上的任何消息,而是希望只处理其中几种。这样一个识别的消费者可以使用一个Selective Consumer来描述它将接收什么类型的消息。然后消息系统将只将匹配的消息对该接受者描述为可用。
<o:p> </o:p>
当断开连接的时候订阅消息 - Publish-Subscribe Channels带来的问题是,如果一个消费者感兴趣一个channel,但是现在网络是断开的怎么办?是不是一个未连接的应用将错过发布的消息,即使它已经订阅过该消息?默认的,是的,订阅只对连接的订阅者有效,为了使应用不会因为连接而错过订阅的消息,要使用Durable Subscriber。
<o:p> </o:p>
等幂 - 有时一个消息可能被传输不只一次,可能因为消息系统不确定该消息是否已经被成功的传递过,或者可能因为Message Channel的QoS被设置较低来提高效率。另一面的,消息接受者认为每个消息只会被传输一次,并且当它们重复处理相同的消息,它们会出错。一个Idempotent Receiver可以优雅的处理重复的消息,并且阻止它们引起接收者应用的发生错误。
<o:p> </o:p>
同步或异步服务 - 另外一个选择是一个应用应该暴露它的service为同步(RPI)还是异步的(Messaging)。不同的客户端可能喜欢不同的方式;不同的环境可能需要不同的方式。既然很难选择,就一起使用。一个Service Activator连接一个Message Channel到一个应用的同步服务以便当一个消息被接收,service就被调用。同步客户端可以简单的直接调用service;异步客户端可以通过发送消息调用service。
<o:p> </o:p>
Message Endpoint的相关主题
<o:p> </o:p>
Message Endpoint的另外一个重要主题是很难同其他模式共同应用Transactional Client。Event-Driven Consumer通常不能适当的在外部控制事务,Message Dispatcher也必须小心的设计这个问题,Competing Consumers的事务也是个重大问题。最安全的使用Transactional Client是使用一个单独的Polling Consumer,但是这不会是一个令人满意的解决方案。
<o:p> </o:p>
这里特别要提到应该会保证成功的JMS风格的MDB,EJB的一种。一个MDB是一个消息消费者,它即使一个Event-Driven Consumer又是一个支持J2EE分布式事务的Transactional Client,并且它可以作为Competing Consumers动态的池化,甚至作为一个Publish-Subscribe Channel。这是在一个自由的应用中实现这些是一个困难且乏味的组合,但是这个功能作为一个EJB容器的内建的功能被提供。(MDB框架如何实现的?本质上,容器通过一个动态改变大小的可重用的执行者的线程池来实现了一个Message Dispatcher,在那里每个执行者自己使用自己的session和事务来消费消息。)
<o:p> </o:p>
最后,紧记一个单独的Message Endpoint可以很好结合几个不同的模式。一组Competing Consumers可以被作为Polling Consumers实现,同时也可以是一个Selective Consumers并且可以作为一个Service Activator调用一个应用的service。
一个Message Dispatcher可以是一个Event-Driven Consumer和一个使用Messaging Mapper的一个Durable Subscriber。无论一个endpoint实现什么模式,它总是一个Messaging Gateway。所以,不要考虑使用哪种模式 - 而要考虑如何结合他们。这是使用模式解决问题的魅力所在。
<o:p> </o:p>
要实现一个Message Endpoint有很多选择。Message Endpoint模式用于解释这些选择是什么以及如何最好的使用它们。
<o:p> </o:p>
<o:p> </o:p>
分享到:
相关推荐
- **ESB-unaware Message**:如SOAP消息,需要通过Adapter(在JBoss ESB中称为Gateway)转化为ESB-aware Message才能被处理。 3. **服务(Service)** - **Endpoint Reference (EPR)**:用于描述ESB内部服务的标识...
- 通过使用开放标准(如Web服务及其相关协议),ESB可以更加灵活地与其他系统集成。 #### Mule ESB简介 **Mule ESB**是一个基于Java的开源集成平台,专注于为企业提供高性能且易于使用的集成解决方案。Mule的设计...
### Mule ESB 开发实例详解 #### 一、Mule ESB 概述与应用场景 Mule ESB (Enterprise Service Bus) 是一种用于集成不同系统和服务的企业级平台。它提供了一个灵活且强大的架构,使得开发者能够轻松地连接不同的...
Mule ESB 开源框架简介 Mule ESB 是一个基于 Java 的轻量级企业服务总线和集成平台,允许开发人员快速便利地连接多个应用,并支持应用间的数据交换。Mule ESB 支持集成现有系统而无论其底层采用何种技术,如 JMS、...
《Mule ESB开发实践详解》 Mule ESB,全称Mule Enterprise Service Bus,是一种强大的企业级服务总线,用于构建灵活、可扩展的集成解决方案。它提供了一个平台,使得不同系统间的通信变得更加简单,支持多种协议和...
Mule ESB支持多种传输协议,用户需要学会配置Mule Endpoint URIs,并理解如何通过不同的传输方式连接SaaS、社交媒体和其他电子商务平台。 6. 云连接集成: Mule Cloud Connect是Mule ESB中用于连接云服务和SaaS应用...
### MULE ESB 节点使用说明中文文档 #### MULE ESB 概述与部署 MULE ESB(Enterprise Service Bus)是一种强大的集成平台,用于构建高度可扩展的应用程序和服务。它允许开发人员轻松地连接不同的应用程序、API 和...
- **Endpoints(端点)**: 是消息目标地址的抽象表示,Mule ESB中的每个消息都需要有一个或多个endpoint定义它的目的地。 - **Transports(传输)**: 指定了消息是如何在网络上从一个点传输到另一个点的,Mule ESB...
Mule 是一个基于ESB架构理念...所有UMO和其他应用之间的通信都是通过消息端点(message endpoint)来进行的。这些端点为众多的分立的技术,比如Jms, Smtp, Jdbc, Tcp, Http, Xmpp, file等等,提供了简单和一致的接口。
- **Mule ESB**:不仅是一个集成框架,还是一个完整的 ESB 解决方案,具有更多的内置功能和服务,但可能会带来更高的复杂度。 综上所述,Apache Camel 作为一种成熟的企业集成框架,为企业应用集成提供了强大而灵活...
### Mule ESB 整体概念详解 ...通过上述介绍,我们可以了解到 Mule ESB 的强大功能及其在现代软件集成中的重要地位。无论是对于初学者还是有经验的开发者而言,掌握 Mule ESB 的基本概念和技术要点都是非常重要的。
《Mule ESB实战:基于mule-2.2.1-src的开发示例解析》 ...通过研究源代码、实践示例项目并参考相关文档,开发者可以逐步掌握Mule ESB的精髓,从而在实际工作中构建高效、灵活的企业级集成解决方案。
JBI规范中规定了企业服务总线上的服务组件如何相互交互,并定义了消息交换模式(Message Exchange Patterns,MEPs)和JBI应用程序接口(JBIAPI)。 2. 消息交换模式(MEPs) JBI定义了四种标准的消息交换模式,包括...
Mule是一款强大的企业级服务总线(Enterprise Service Bus, ESB),它支持各种集成模式和传输协议,使得数据能够在不同的应用程序和服务之间进行高效传递。 ### Mule 2.1.1 用户指南概览 Mule 2.1.1用户指南主要...
- **1.2.2 竞争**:在 ESB 领域,Mule 面临着来自其他知名框架的竞争,如 Apache Camel、WSO2 ESB 和 IBM WebSphere Message Broker 等。 **1.3 Mule 的解剖结构** Mule 的架构设计围绕几个核心概念构建: - **...
- 每个节点的输入是上一个节点的输出,输出则成为下一个节点的输入,这个过程中的数据被称为 payload,并封装在 `MuleMessage` 对象中进行传递。 - 当节点间的输入输出类型不匹配时,可以通过添加消息转换器来解决。...
- **Java消息服务端点(Java Message Service, JMS Endpoint)**:用于处理JMS消息。 - **VM端点**:用于在Mule应用程序内部发送消息。 #### 七、组件(Components) - **Java组件**:允许开发者编写自定义的Java...
Mule ESB(Enterprise Service Bus,企业服务总线)是一种流行的开源集成平台,用于构建连接应用程序和服务的复杂系统。在本教程中,我们将探讨Mule的实际应用,通过代码示例来理解其工作原理。 首先,我们需要了解...