Shuttle ESB(三)——架构模型介绍(2)

上一篇文章中,介绍了Shuttle ESB架构模型中的三个重要部分。今天,我们继续介绍剩余的三个内容:模式和消息路由。

四、模式

Request/Response(请求/响应模式)

对基于Request/Response消息机制的内容,你可以看WiKi的一些文章:http://en.wikipedia.org/wiki/Request-response

向一个终端发送请求,执行某项功能,你可以发送一个命令消息:

bus.Send(new RequestMessage());

虽然这是一个非常简单的模式,但是,它却构成了一种耦合紧密的行为。尽管如此,这也未必是一件坏事,在许多情况下这是绝必需的。

通常,命令消息的Handler(处理程序),进行业务逻辑与消息的处理。但是很多时候,请求需要有响应。

响应可以以命令消息或者事件消息的形式返回。使用的时候非常简单,你只需要通过服务总线实例进行如下调用:

bus.Send(new ResponseMessage(), c => c.Reply());

当然,只要你愿意,你可以将“响应”作为事件消息返回,来达到解耦合的目的。那么这将不再是请求/响应模式了,而是发布订阅模式。

请求/响应模式的好处是:它提供了一种机制,使调用者发出调用请求后,能够收到服务端的反应。

Publish/Subscribe(发布订阅模式)

对于基础发布订阅消息模式的更多内容,你可以看这里:http://en.wikipedia.org/wiki/Publish/subscribe

这种模式的特点就是,让发布者和订阅者之间没有行为耦合。实际上,一个事件消息可能都没有订阅者。但是这是不太符合实际情况的。太多的实践证明,大多数情况下,我们要求至少要有一个订阅者。

发布一个事件消息,你可以采用如下格式:

bus.Send(new ResponseMessage(), c => c.Reply());

消息发送后,每一个订阅者会都到接收到自己的消息。这完全不同于一对一的消息分配处理机制。

消息分发

可想而知,如果一个端点接收太多的消息,那么处理这些消息就会端点处理能力降低,而且变得臃肿不堪。这种情况下,可以将消息改分配到服务节点上。

如果该终端接收到一个服务节点的请求消息,它将向其他服务节点自动分配该消息。一个终端可以配置成只发送消息。配置很简单,只需要设置收件箱标签分配属性为true即可。

由于消息分布都集成到收件箱,在处理相同端点时,只需要在多个不同的机器上安装一对一的消息。你接收消息的一端,需要一个控制收件箱的配置。因为所有的Shuttle消息都需要处理,而不是在队列中保持等待状态。

每一个服务站点在配置中唯一标识,端点的控制收件箱需要如下配置:

<configuration>
   <configSections>
      <section name="serviceBus" type="Shuttle.ESB.Core.ServiceBusSection, Shuttle.ESB.Core"/>
   </configSections>
<serviceBus>
      <control
          workQueueUri="msmq://./control-inbox-work"
          errorQueueUri="msmq://./shuttle-error"/>
      <inbox
          distribute="true"
          workQueueUri="msmq://./inbox-work"
          errorQueueUri="msmq://./shuttle-error"/>
   </serviceBus>
</configuration>

任何接收消息的一端都能这样配置。

然后,你就可以根据你的需要,建立多个服务节点。随着相关的所有发布者的增多,就会形成一个消息的逻辑终点。发布者的配置如下:

<configuration>
   <configSections>
      <section name="serviceBus" type="Shuttle.ESB.Core.ServiceBusSection, Shuttle.ESB.Core"/>
   </configSections>
<serviceBus>
      <worker
         distributorControlWorkQueueUri="msmq:///control-inbox=work" />
      <inbox
         workQueueUri="msmq://./workerN-inbox-work"
         errorQueueUri="msmq://./shuttle-error"
         threadCount="15">
      </inbox>
   </serviceBus>
</configuration>

只要应用程序配置文件包含一个闲置线程的标记,它就会发送一个消息给发布者,表明一个线程成为可执行的。然后订阅者将为每个可用的线程发布消息。

当应用程序配置文件包含工人标记每个线程去闲置将消息发送到经销商表示,一个线程已成为可执行的话。经销商将为每个可用的线程发送消息。

消息分发的特例

一些队列不需要消息分发。不使用客户终端,而是用它的另一个实例,也可以使用相同的输入队列。这种机制适用于代理。因为代理通过消费者线程运行的消耗,集中管理消息。因为消费者来自哪里都无所谓,所以队列能够给各个线程使用。

像基于MSMQ或者基于SqlServer的队列,这些都是通过启一个线程运行host,使用Handler进行消息处理。代理的方式不同于这种方式。在代理方式中,过程A将不知道这些消息所消耗的过程,而且导致B过程可能向其他端点获取消息。

五、消息路由

通常,我们说发送一个消息。根据“发送”,我们就确定它是一个命令消息。但是,它不一定必须是命令消息。你也可以给一个特定端点发送一个事件消息。实际情况下,更多的往往是发送事件消息,而不是命令消息。消息发送后,通过调用服务总线实例相关的重载方法:

TransportMessage Send(object message);
        TransportMessage Send(object message, Action<TransportMessageConfigurator> configure);

只有那些没有RecipientInboxWorkQueueUri集的信息,将会通过服务总线进行传输。如果你需要访问任何可用的信息源数据,传输信息的Envelop将被退回。Shuttle ESB采用了ImessageRouteProvider的实现,来确认消息发送。

    public interface IMessageRouteProvider
    {
        IEnumerable<string> GetRouteUris(object message);
    }

The message route provider to use is specified when constructing the service bus:

    bus = ServiceBus
        .Create(c => c.MessageRouteProvider(new DefaultForwardingRouteProvider())
        .Start();

默认消息路由提供者,使用应用配置文件,来确定往哪发送消息:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <configSections>
      <section name="serviceBus" type="Shuttle.ESB.Core.ServiceBusSection, Shuttle.ESB.Core"/>
   </configSections>
<serviceBus>
      <messageRoutes>
         <messageRoute uri="msmq://serverA/inbox">
            <add specification="StartsWith" value="Shuttle.Messages1" />
            <add specification="StartsWith" value="Shuttle.Messages2" />
         </messageRoute>
         <messageRoute uri="sql://serverB/inbox">
            <add specification="TypeList" value="DoSomethingCommand, Assembly" />
         </messageRoute>
         <messageRoute uri="msmq://serverC/inbox">
            <add specification="Regex" value=".+[Cc]ommand.+" />
         </messageRoute>
         <messageRoute uri="sql://serverD/inbox">
            <add specification="Assembly" value="TheAssemblyName" />
         </messageRoute>
      </messageRoutes>
   </serviceBus>
</configuration>

IMessageRouteProvider接口的每一个实现,都能决定一个实现线路。然而,它都需要从给定的消息发送。一个典型的场景,以及defaultmessagerouteprovider的工作方式,是使用完整的类型名称来确定目标。

注意:使用发送的每个消息类型,只能被发送到一个端点。

原文地址:http://shuttle.github.io/shuttle-esb/architecture/#Concepts

时间: 2024-10-19 09:34:11

Shuttle ESB(三)——架构模型介绍(2)的相关文章

Shuttle ESB(二)——架构模型介绍

该部分包含如下五部分内容,限于篇幅,本文先介绍前三个:概念.消息类型.耦合. 一.概念 二.消息类型 三.耦合 四.模式 五.消息路由 概念 本位中的所有代码,不是一个完整的例子,也不是一个vs解决方案.它向我们介绍了,在Shuttle ESB里面一些比较重要的概念.在Shuttle ESB入门实例 里面,有一个简单的实现,将这些概念融合在了一起,大家可以结合实例,理解本文的概念. Shuttle ESB的基本组成:消息.队列和服务总线 每一个服务总线实例都是相关联的,因此只有一个输入队列,注意

Shuttle ESB(四)——公布订阅模式实例介绍(1)

前面,我已经集中用了三篇文章来讲Shuttle ESB的入门实例与宏观概念. Shuttle ESB一共同拥有两种发送消息的模式:请求/对应模式与Pub/Sub模式. 关于这两种模式的区分.请看以下文章的介绍:Shuttle ESB(三)--架构模型介绍(2) 在Shuttle ESB的第一篇文章中,关于入门实例的介绍,是基于Command命令的请求响应模式.这样的模式发送的消息比較简单.是同步的. 发送消息端与接收消息端的行为耦合性比較大. 请求发送后,其它进程都会处于等待状态.等待服务端返回

Shuttle ESB(四)——发布订阅模式实例介绍(1)

前面,我已经集中用了三篇文章来讲Shuttle ESB的入门实例与宏观概念.Shuttle ESB一共有两种发送消息的模式:请求/相应模式与Pub/Sub模式. 关于这两种模式的区分,请看下面文章的介绍:Shuttle ESB(三)--架构模型介绍(2) 在Shuttle ESB的第一篇文章中,关于入门实例的介绍,是基于Command命令的请求响应模式.这种模式发送的消息比较简单,是同步的.发送消息端与接收消息端的行为耦合性比较大.请求发送后,其他进程都会处于等待状态,等待服务端返回响应信息后,

Shuttle ESB(四)——宣布订阅模式实例介绍(1)

前,我的重点是关注的三篇文章Shuttle ESB入境和宏观的概念范例. Shuttle ESB模式:请求/对应模式与Pub/Sub模式. 关于这两种模式的区分,请看以下文章的介绍:Shuttle ESB(三)--架构模型介绍(2) 在Shuttle ESB的第一篇文章中,关于入门实例的介绍,是基于Command命令的请求响应模式.这样的模式发送的消息比較简单,是同步的.发送消息端与接收消息端的行为耦合性比較大.请求发送后,其它进程都会处于等待状态,等待服务端返回响应信息后,client才会进行

Shuttle ESB介绍

背景介绍 背景一 项目中使用到消息中间件.之前是采用另一位同事的思路实现:主要通过OPC通道,检测前端的消息.一旦发现有新消息,马上发送到各个终端,终端再根据自己的业务需要进行各自的显示以及处理.不过这样实现,系统对接时,出现了很多问题.如项目中很多WPF事件无法触发.几经探索,还是困难重重.所以,就改为今天的思路了. 背景二 技术调研后,经理还是决定使用同事推荐的Shuttle ESB做为消息中间件.也就是放弃了之前OPC的尝试,采用ESB作为消息路由.即前端监测点检测到数据.然后以消息的形式

阿里Java开发工程师理解的三种架构模型

常用的软件架构模型可以归类为三种架构模型:3/N层架构."框架+插件"架构.地域分布式架构. 一.三种架构模型 1.3/N层架构 这是经典的多层架构模型,对于稍微复杂一点或特别复杂的系统,不使用分层架构是很难想象的.下图是经典的3层架构: 如今,凡是个程序员都能侃侃而谈3/N层架构,这确实是解决系统复杂性的一种主流模式,但是,只要采用了3/N层架构是不是就一定能解决系统的复杂性了?不一定,关键在于你在你的系统中如何实作你的3/N层结构. 在采用了3/N层架构后,我们还是要解决以下非常重

PowerDesigner(三)-企业架构模型(转)

企业架构模型(Enterprise Architecture Model,EAM)是PowerDesigner 15新增的功能,它能够以图形的方式展现企业架构,从而取代文字描述:以偏向非技术性的表达方式,从不同层面表达不同的图示结果. 企业架构模型从业务层,应用层和技术层对企业的体系架构进行全方面的描述,包括业务流程,业务功能,系统,人员等单元的结果及行为,以确保各单元能够符合企业的战略发展方向.PowerDesigner企业架构模型包括7种企业架构流程图,这7种企业架构流程图可以划分为以下3个

Shuttle ESB(六)——在项目中的应用

如果说你认真看了前面几篇关于ESB的介绍,我相信,在这一篇文章中,你将会找到很多共鸣. 尽管,市面上开源的ESB确实非常之多,像Java中的Mule ESB,Jboss ESB:.Net中的NServiceBus.而Shuttle ESB是一个新兴的开源框架,网络上资源也比较少.我们当初为什么会选用Shuttle ESB呢? 正所谓没有最好,只有更合适.多次调研发现,Shuttle ESB有以下几大优点:1.Shuttle ESB是基于EDA的:2.Shuttle ESB的实现以发布订阅为核心:

Shuttle ESB(六)——在工程中的应用

假设你可能浏览在前面几篇文章ESB介绍,我相信,在这篇文章中,你会发现很多共鸣. 虽然.市面上开源的ESB确实很之多.像Java中的Mule ESB.Jboss ESB:.Net中的NServiceBus.而Shuttle ESB是一个新兴的开源框架,网络上资源也比較少.我们当初为什么会选用Shuttle ESB呢? 正所谓没有最好.仅仅有更合适.多次调研发现,Shuttle ESB有下面几大长处: 1.Shuttle ESB是基于EDA的: 2.Shuttle ESB的实现以公布订阅为核心: