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

如果说你认真看了前面几篇关于ESB的介绍,我相信,在这一篇文章中,你将会找到很多共鸣。

尽管,市面上开源的ESB确实非常之多,像Java中的Mule ESB,Jboss ESB;.Net中的NServiceBus。而Shuttle ESB是一个新兴的开源框架,网络上资源也比较少。我们当初为什么会选用Shuttle ESB呢?

正所谓没有最好,只有更合适。多次调研发现,Shuttle ESB有以下几大优点:1、Shuttle ESB是基于EDA的;2、Shuttle ESB的实现以发布订阅为核心;3、Shuttle ESB核心不依赖任何第三方组件。

Shuttle ESB的这些特点,与项目的快速通信、广播消息、高度可控非常吻合。

经过前面几篇博客的讲解,大家对Shuttle ESB这一开源项目应该已经不陌生了。

但是,如何把它应用到项目中,架构起来,并正常运行,也不是一件简单的事情。我在完成这个工作的期间,就遇到了很多这样那样的问题(既然选择了较新的技术,就一定会遇到这样的问题)

所以,我决定以项目为主要选材,抽象出来一个模型,供大家参考。希望对想学习该框架的朋友,起到一定的帮助作用。另外,您如果有任何疑问,或者新的想法,请及时跟我联系或者留言。我会尽量满足。

注:关于这篇文章是否侵权,我已经多方考察过。目前,在全国,并不是我们唯一一家在做这个的。而我们将模仿Sum公司,致力于做一个全国联网的系统。当然,其他局也可以做,但是如果实现多局共享,就必须参照我们制定出来的标准。既然很多家都在做,那么我就避重就轻,避开特色的东西,谈谈共性的需求,就不涉及侵权了。

下面我就来介绍一下,Shuttle ESB在项目中的应用

宏观上来讲,这是一款铁路局列车行驶时的灾害监测系统。项目划的圈比较大,它要实现的是一种全国的联网。这样,一条ESB服务总线就不够用了。而且,据我对Shuttle ESB的性能测试,当客户端不断增多的时候,消息的传输速度会随之降低。这虽然对我们现系统运行影响不大,但是这样就限制了客户端的数量。

此外,对于Shuttle ESB实例启动的时候,会导致系统有一个很高的IO吞吐量。这两个问题,目前我也没有解决,尽管Eben多次跟我说没事儿,这还是我对这个系统最担心的地方。

考虑到上面提到的问题,并且结合实际情况,我们对系统中ESB部分的架构做如下设计:

这样设计,每一个分局至少有一条ESB服务总线,将系统中显示终端控制器、规则引擎、WCF服务、以及相关的通信系统都挂在这条总线上。由于ESB主要起到消息路由器的作用,一旦相关的通信系统或某终端显示器发出消息,该局所有显示终端都会接收到消息。

那么怎样实现全国联网呢?每个分局的ESB服务总线都会遵循一定的标准设计。然后再利用二八定律,将频繁通信的分局ESB总线上之间,架设一条新的服务总线。最终,全国可能会有很多条服务总线。但是,所有的总线都会挂在一条总线上,实现全国联网。

下面,我就来介绍一条服务总线的详细架构设计

如图2所示,它的操作流程基本如下:

1、Shuttle ESB Server为报警数据的接收端,也是报警数据和报警解除数据的发送端。通信系统检测到报警信息,通信系统会将报警数据以CopyData消息的方式发送至队列,Shuttle ESB Server将接收该消息;

2、Shuttle ESB Server总程序接收到消息后,并对消息进行相应的处理(包括:格式转换、升降级判断、自动解除判断等等)。然后将处理后的报警消息发送给客户端A机器、客户端B机器……

3、终端控制器MainClient通过Handler接收到消息后,然后将处理后的报警消息发送给本机的各个终端显示器,如列调终端、综合调度台;

4、显示终端接收到报警解除消息后,它会经过一定的逻辑处理,然后发布一条报警解除的消息;

5、Shuttle ESB Server的Handler将接收该解除消息,经过一定的处理后,它会将报警解除消息重新发送给终端控制器,继而通知到所有订阅该消息的终端。

通过如上流程,将就一条最简单的Shuttle ESB服务总线架设在了系统之上。

我在完成这个过程的时候,分享几个比较棘手的问题:

Shuttle ESB开源项目dll版本问题

开始研究Shuttle ESB时,总是有dll版本问题,导致在项目集成时,遇到很多问题。

后来使用NuGet插件,屏蔽了这个问题。

设计缺陷

如上图2设计图,开始设计时,ESB Server发布消息,MainClient接收,然后MainClient再发送给各个显示终端。同时显示终端也可以将消息重新发送给ESB Server。这个过程中,一共启动了两个ESB实例(不包括ESB Server),原因是:

一、MainClient需要启动一个ESB实例,监听消息;

二、多个显示终端共用一个Shuttle ESB实例,来监听消息。

这样设计是有问题的,而且会间歇性的报各种各样的怪问题:

一、ESB实例启动时,需要启动大量的相关服务,这是比较耗时间的。登录时启动两个实例,很不明智;

二、Server发送大量的消息,导致客户端无法接受正常的消息。它会一直接收错误消息,直到消息队列中没消息为止。

后来与Eben谈及此问题,他告诉我:在一个进程中,只能启动一个Shuttle ESB服务总线实例,不然会导致系统不稳定。

解决方案很简单,既然启动两个不行,而且费力不讨好,那么去掉MainClient的服务总线实例,让显示终端直接监听Shuttle ESB Server的消息,也能够正常实现。

组件不识别资源

原错误信息如下:


组件“ICT.RCS.Modules.Client.MainMenu.MainMenu”不具有由 URI“/ICT.RCS.Modules.Client.MainMenu;component/mainmenu.xaml”识别的资源。

这个问题,报错报的也很莫名其妙。经过反复尝试,我的解决方案是更改MainFrameWork的生成路径到Module下。

思路很简单,由于总是报错照不到资源,我就将所有项目的生成路径更改到每个项目的debug下。项目就能正常运行。不过具体是哪个资源导致的不识别,就不知道了,我也没有深入研究。

正常的系统,不稳定

发送报警数据时,有时报错。

原因是:我与C++组的同事约定,C++与Shuttle ESB交互的部分,她那边拼接一个字符串过来,之间使用逗号“,”隔开。我这边按照约定进行拆分,然后转化为数组。

当她发送多区段时(多区段也是用逗号分隔,多区段涉及到具体业务),数组总会多出几项,导致越界错误。

多线程解决系统启动慢的问题

由于系统登录时,需要加载一堆服务,而且需要启动ESB实例。非常耗时。用户体验非常不好。

所以,我有一个思路:模拟Ajax,系统登录时,另启动一个线程,负责客户端Shuttle ESB总线实例的启动。

优点:用多线程来优化程序,减少启动时间,增强用户体验。

缺点:设计线程同步问题,没有经验。

使用Oracle 数据库表队列

目前,Shuttle ESB提供三种队列支持:MSMQ、SqlServer基于表的队列和RabbitMQ。目前项目中使用的是SqlServer基于表的队列。如果想换成Oracle,必须自己写,没时间。

集成后不好调试

将Shuttle ESB集成到项目中后,仍需处理大量的业务数据以及相关逻辑。我这里判断的一些报警,还需要与规则引擎想结合,进行判断。同时,ArcGis地图界面,业务逻辑在不断变化,他们也需要不断作出调整。数据的来源端C++端也在处在开发期间,它也需要与规则引擎交互……

也就是说,只要系统有问题,就和我相关。测试的同事只要测出来问题,就跑我这来说问题。我都是一步步跟代码,找出是谁那的问题后,再让他改。费时费力啊。

过了几天后,我实在无法忍受了。因为这样,我就干不了别的活了。然后,我将所有与Shuttle ESB交互的地方,都加上错误处理,写上明显的错误提示,这样,测试找我才稍微少了一些。

时间: 2024-08-10 21:29:57

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

Shuttle ESB(一)——入门实例

下载Shuttle ESB 从GitHub项目公布页,下载最新的公布版本号. Shuttle-ESB源代码包列表:http://www.nuget.org/packages?q=shuttle-esb 公布页面:https://github.com/Shuttle/shutle-esb/releases 使用MSMQ高速入门 由于Shuttle ESB须要队列来操作.所以我们使用微软的MSMQ来实现.在做实例前,必须先确保你电脑上安装了MSMQ. 安装MSMQ:http://msdn.micro

Shuttle ESB(五)——发布订阅模式实例实现(2)

我们接上篇文章,继续来介绍Shuttle ESB的Pub/Sub模式. 上一篇文章中,我们已经用语言描述了一个用ESB实现的场景,下面给我给出具体的代码实现. 首先,我们需要了解一下Shuttle ESB各个dll的功能: Shuttle.Core.Data:轻量级框架,使用ADO.NET的工厂和接口 Shuttle.Core.Domain:提供事件调度支持 Shuttle.Core.Host:通用主机,它能在控制台应用或者windows服务中运行 Shuttle.Core.Infrastruc

Shuttle ESB介绍

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

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

Shuttle ESB实现局域网消息推送

ESB全称Enterprise Service Bus,即企业服务总线.它是传统中间件技术与XML.Web服务等技术结合的产物. ESB的出现改变了传统的软件架构,可以提供比传统中间件产品更为廉价的解决方案,同时它还可以消除不同应用之间的技术差异,让不同的应用服务器协调运作,实现了不同服务之间的通信与整合. 看吧,ESB的功能是如此强大.在java中常用的是Mule ESB,而到了.Net,Shuttle ESB作为一种新生的ESB正在慢慢的被人们所接受.下面通过一个实例讲解Shuttle ES