上一篇文章中,介绍了Shuttle ESB架构模型中的三个重要部分。

今天,我们继续介绍剩余的三个内容:模式和消息路由。

四、模式

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

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

向一个终端发送请求。运行某项功能,你能够发送一个命令消息:

bus.Send(new RequestMessage());

虽然这是一个很easy的模式,可是,它却构成了一种耦合紧密的行为。虽然如此,这也未必是一件坏事。在很多情况下这是绝必需的。

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

响应能够以命令消息或者事件消息的形式返回。

使用的时候很easy。你仅仅须要通过服务总线实例进行例如以下调用:

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

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

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

Publish/Subscribe(公布订阅模式)

对于基础公布订阅消息模式的很多其它内容,你能够看这里:http://en.wikipedia.org/wiki/Publish/subscribe

这样的模式的特点就是。让公布者和订阅者之间没有行为耦合。实际上,一个事件消息可能都没有订阅者。

可是这是不太符合实际情况的。

太多的实践证明,大多数情况下,我们要求至少要有一个订阅者。

公布一个事件消息,你能够採用例如以下格式:

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

消息发送后。每个订阅者会都到接收到自己的消息。

这全然不同于一对一的消息分配处理机制。

消息分发

可想而知,假设一个端点接收太多的消息。那么处理这些消息就会端点处理能力减少,并且变得臃肿不堪。

这样的情况下,能够将消息改分配到服务节点上。

假设该终端接收到一个服务节点的请求消息,它将向其它服务节点自己主动分配该消息。一个终端能够配置成仅仅发送消息。配置非常easy,仅仅须要设置收件箱标签分配属性为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

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

  1. word2vec 入门(三)模型介绍

    两种模型,两种方法 模型:CBOW和Skip-Gram 方法:Hierarchical Softmax和Negative Sampling CBOW模型Hierarchical Softmax方法 C ...

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

    前,我的重点是关注的三篇文章Shuttle ESB入境和宏观的概念范例. Shuttle ESB模式:请求/对应模式与Pub/Sub模式. 关于这两种模式的区分,请看以下文章的介绍:Shuttle E ...

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

    前面,我已经集中用了三篇文章来讲Shuttle ESB的入门实例与宏观概念. Shuttle ESB一共同拥有两种发送消息的模式:请求/对应模式与Pub/Sub模式. 关于这两种模式的区分.请看以下文 ...

  4. Shuttle ESB

    Shuttle ESB(六)——在项目中的应用 如果说你认真看了前面几篇关于ESB的介绍,我相信,在这一篇文章中,你将会找到很多共鸣. 尽管,市面上开源的ESB确实非常之多,像Java中的Mule E ...

  5. 【Hadoop离线基础总结】Hadoop的架构模型

    Hadoop的架构模型 1.x的版本架构模型介绍 架构图 HDFS分布式文件存储系统(典型的主从架构) NameNode:集群当中的主节点,主要用于维护集群当中的元数据信息,以及接受用户的请求,处理用 ...

  6. 第1节 kafka消息队列:2、kafka的架构介绍以及基本组件模型介绍

    3.kafka的架构模型 1.producer:消息的生产者,主要是用于生产消息的.主要是接入一些外部的数据源,从外部获取数据,比如说我们可以从flume获取数据,还可以通过ftp传入数据等,还可以通 ...

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

    企业架构模型(Enterprise Architecture Model,EAM)是PowerDesigner 15新增的功能,它能够以图形的方式展现企业架构,从而取代文字描述:以偏向非技术性的表达方 ...

  8. 第1节 storm编程:3、storm的架构模型的介绍

    nimbus:主节点,接收客户端提交的任务,并且分配任务,新的版本当中nimbus已经可以有多个了 zookeeper集群:storm依靠zk来保存一些节点信息,nimbus将分配的任务信息都写入到z ...

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

    假设你可能浏览在前面几篇文章ESB介绍,我相信,在这篇文章中,你会发现很多共鸣. 虽然.市面上开源的ESB确实很之多.像Java中的Mule ESB.Jboss ESB:.Net中的NServiceB ...

随机推荐

  1. 13.AxisUtil

    1. package com.glodon.gspm.adapter.plugin.common; import lombok.SneakyThrows; import org.apache.axis ...

  2. 【习题 7-7 UVA-12558】Egyptian Fractions (HARD version)

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 迭代加深搜索. 枚举最大量maxdep 在dfs里面传剩余的要凑的分子.分母 以及上一次枚举的值是多少. 然后找到最小的k,满足1/ ...

  3. Java Drp项目实战——Servlet

    由来 在解说Servlet之前须要先介绍一个词语CGI即Common GatewayInterface是通用网关接口的意思.它提供一个计算机程序同HTTP协议或者WWW服务的接口,也就是人机交互接口的 ...

  4. 【MongoDB】在windows平台下mongodb的分片集群(六)

    在本篇博客中我们主要讨论下博客的管理.因为已经在前面五篇中写了具体的实例,因此这里就不再举例说明. 一.监控 分片集群是整个体系中比較复杂的一块,因此更应该须要监控. 主要命令: serverstat ...

  5. Objective-C - 类的静态常量

    创建头文件(.h), 导出常量: // Constants.h FOUNDATION_EXPORT NSString *const MyFirstConstant; FOUNDATION_EXPORT ...

  6. textview-调节字体间距跟行距

    直接进行代码验证 1)当没有添加字体间距属性的时候 <TextView android:id="@+id/text_view" android:layout_width=&q ...

  7. python 序列排序 排序后返回相应的索引

    https://blog.csdn.net/longwei92/article/details/83098289 https://blog.csdn.net/u013731339/article/de ...

  8. 有关Canvas的一点小事—canvas和resize

     之前就说了canvas设置大小的时候用的就是设置实打实的像素值,像图像一样设置百分比然后根据浏览器大小自己适应大小是不可能的——当然一般也不会想要cavans改变大小.不过项目之前有用到过,既然去了 ...

  9. 一个简单http请求的jmeter压测实战流程

    1.新建线程组 2.创建http请求 注意:接口路径中的参数值要写变量 3.创建txt文件,存多个参数值 4.创建csv文件,在csv中上传txt文件 5.variable name填写txt中参数值 ...

  10. echarts3.0 仪表盘实例更改完成占用率实例

    需要完成的项目效果 官方实例效果 基本思路: 首先引入jquery和echarts3.0库. 需要两个仪表盘,一个仪表盘是纯色灰色,在底部.startAngle 和endAngle永远是最大值,默认为 ...