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

该部分包含如下五部分内容,限于篇幅,本文先介绍前三个:概念、消息类型、耦合。

一、概念

二、消息类型

三、耦合

四、模式

五、消息路由

概念

本位中的所有代码,不是一个完整的例子,也不是一个vs解决方案。它向我们介绍了,在Shuttle ESB里面一些比较重要的概念。在Shuttle
ESB入门实例
里面,有一个简单的实现,将这些概念融合在了一起,大家可以结合实例,理解本文的概念。

Shuttle ESB的基本组成:消息、队列和服务总线

每一个服务总线实例都是相关联的,因此只有一个输入队列,注意只能有一个输入队列。这个输入队列就是一个收件箱。收件箱中接收的所有消息,都是由服务总线实例进行使用。

消息

Shuttle是基于消息的。这些消息是实现了指定接口的数据传输对象。例如:

public class ActivateMemberCommand
    {
        string MemberId { get; set; }
    }
public class MemberActivatedEvent
    {
        string MemberId { get; set; }
    }

队列

Shuttle ESB中的消息,都是由Handler处理的。当一个服务总线实例启动的时候,它就开始监听收件箱里的队列消息。所以,在相关队列里面处理的消息,一定要有结束。收件箱的配置,是在应用程序配置文件中设置的。

这种消息发送的方法,采用至少发送一次的机制。这不同于传统概念上的,准确传递一次的例子。在某些临界情况,它可能多次处理消息。然而,其他机制的临界情况,可能会导致信息的丢失(一个重复的消息比没有消息更容易点)

很重要的一点就是:所有的队列都是无损的,并且有确认反馈机制。

所以,一旦消息从队列中重新取回,就有可能是确认消息释放消息返回到队列。

服务总线

在每个应用程序访问服务总线时,服务总线实例是必须的。服务总线的基本组成:关联的代码、应用程序配置文件和应用自定义组件。例如:

public class ServiceBusHost : IHost, IDisposable
    {
        private static IServiceBus bus;
public void Start()
        {
            bus = ServiceBus.Create().Start();
        }
public void Dispose()
        {
            bus.Dispose();
        }
    }

创建并运行一个服务总线实例创建,同时,启动和配置退出应用程序。服务总线可以在任何类型的应用程序中使用,最经典的情况就是作为服务进行通信。虽然你可以自己写服务,来作为服务总线,但是它是不必要的,因为你可以能用到通用主机:generic service host:http://shuttle.github.io/shuttle-esb/generic-host/index.html

消息类型

命令消息

由于命令是一个要求执行特定功能的明确请求,因此命令会被发送到单独的终结点。也就是说:为了发送消息,你需要知道某个终结点的相关业务实现。因此,命令导致了高度的行为耦合。如果在发送消息时,那个接收消息的终结点是可配置的,那么便可随时更改终结点。

一个命令消息总是属于单一的一端。发送一个命令也永远不会导致一个消息出现在多个队列里。

虽然,我们应该尽量减少使用这种消息类型,但是它在特殊情况,也有使用的必要性,例如下面的例子。

启动一个应用

在我们的应用程序中,我们需要发送一个CreateOrderCommand 队列服务。这将启动相关过程。

所以从客户端代码开始:

bus.Send(new CreateOrderCommand("ClientName", "ProductXYZ"));

如果没有消息接收端,这次调用就会失败。

现在我们发布一个事件,像OrderReceivedEvent 和我们的队列服务,能够订阅一个事件,也能够取消订阅事件。

bus.Publish(new OrderOrderReceivedEvent("ClientName", "ProductXYZ"));

如果没有订阅者,调用也不会失败。

因此,不同之处就是:使用消息的情况不同。当我们使用事件时,我们会选择订阅模式;但是当一个系统中,已经确定一些特定行为的时候,使用命令的方式,应该更合适一些。当然,当使用一个命令的方法时,仍然有一些其他系统知道对方已经接收到了命令,那么订单服务会接着发布一个事件。

底层方法(RPC)

在某些情况下,一个事件可能无法传递某个动作的意图。例如:当一个命令创建的时候(或者是命令的数量超过上限的时候),我们可能会给领导发一封邮件。电子邮件服务负责通过SMTP服务器发送电子邮件。这电子邮件是无法通过OrderReceivedEvent事件订阅的,因为电子邮件系统需要适应另一个系统中的规则。

在这个例子中,邮件系统负责发送邮件。 任何系统发送邮件,都需要决定什么时候发送。因此,这个订单服务将向邮件服务发送一个指令:

bus.Send(new SendMailCommand
                 {
                     To = "[email protected]",
                     From = "[email protected]",
                     Subject = "Important Order Received",
                     Body = "Order Details"
                 });

事件消息

一个事件消息就是用来通知所有的订阅组件。每个组件订阅事件,将得到一份事件消息。对于一个事件来说,如果没有订阅者,那么用户也不会有什么影响。

文档消息

一个文档消息用来简单的向一段发送数据。与使用事件消息一样,文档消息一定的方向性,接受者可以接收也可以不接收。但是,这不意味着数据会无缘无故的发送到一个终端。终端可能需要从一些服务中获取一个文档消息。或者根据需要,数据会自动发送给某些终端。

耦合

行为耦合

行为耦合是指一个系统与另一个系统行为的耦合程度。当你的系统接收到一个命令消息,你需要它在某个特定需求中使用。这就代表着一种高度的行为耦合。然而,当一个事件消息发布好了,没有订阅者等待获取消息。这就是一个较低的行为耦合。

也就是说:可能有一个期望的事件会导致一个特定的结果。在这种情况下,行为的耦合增加了。

时空耦合

时空耦合指的是一个服务的可用性。例如:ServiceA服务依赖ServiceB服务。为了保证ServiceA能够正常运行,需要同时保证ServiceB是可用的,然后ServiceA才能够正常运行。这就是一个高度的时空耦合。相反的,如果ServiceA没有ServiceB,仍然能够正常运行,那么这就是一个低时空耦合。

一个异步Web-Service调用就是一个高时空耦合例子。

现在你可能会心存疑虑:在一个用例中,需要ServiceA和ServiceB两个服务,才能够完成。那么,他们是怎么单独进行的?

这其实很简单,答案就是:使用队列,进行异步通信。

你可能会说了:一个web-Service的调用可能使用异步通信,但是这里还是有问题的。当一个客户端的请求未接到相应时,ServiceA可能会执行失败。这就会导致web-Service调用失败。

我们使用消息进行通信,消息经常会向着一个方向传递。从ServiceA到ServiceB是一个动作,执行之后,这个动作就结束了;从ServiceB到ServiceA又是一个动作,执行之后,这个动作就又结束了。

时间: 2024-10-12 04:36:24

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

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

上一篇文章中,介绍了Shuttle ESB架构模型中的三个重要部分.今天,我们继续介绍剩余的三个内容:模式和消息路由. 四.模式 Request/Response(请求/响应模式) 对基于Request/Response消息机制的内容,你可以看WiKi的一些文章:http://en.wikipedia.org/wiki/Request-response 向一个终端发送请求,执行某项功能,你可以发送一个命令消息: bus.Send(new RequestMessage()); 虽然这是一个非常简单

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作为消息路由.即前端监测点检测到数据.然后以消息的形式

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的实现以公布订阅为核心:

MVVM架构简单介绍

MVVM架构简单介绍 1 程序为什么要架构:便于程序员开发和维护代码. 2 常见的架构思想: MVC M:模型 V:视图 C:控制器 MVVM M:模型 V:视图+控制器 VM:视图模型 MVCS M:模型 V:视图 C:控制器 C:服务类 VIPER V:视图 I:交互器 P:展示器 E:实体 R:路由 (http://www.cocoachina.com/ios/20140703/9016.html) 3 MVVM介绍 模型(M):保存视图数据. 视图+控制器(V):展示内容 + 如何展示

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

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