假设你可能浏览在前面几篇文章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的性能測试,当client不断增多的时候。消息的传输速度会随之减少。

这尽管对我们现系统执行影响不大,可是这样就限制了client的数量。

此外。对于Shuttle ESB实例启动的时候,会导致系统有一个非常高的IO吞吐量。这两个问题。眼下我也没有解决。虽然Eben多次跟我说没事儿。这还是我对这个系统最操心的地方。

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

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

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

可是,全部的总线都会挂在一条总线上,实现全国联网。

以下。我就来介绍一条服务总线的具体架构设计

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1NzY1MDIzMDUx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

如图2所看到的,它的操作流程基本例如以下:

1、Shuttle ESB Server为报警数据的接收端,也是报警数据和报警解除数据的发送端。

通信系统检測到报警信息,通信系统会将报警数据以CopyData消息的方式发送至队列,Shuttle ESB Server将接收该消息;

2、Shuttle ESB Server总程序接收到消息后,并对消息进行对应的处理(包含:格式转换、升降级推断、自己主动解除推断等等)。然后将处理后的报警消息发送给clientA机器、clientB机器……

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

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

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

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

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

1、Shuttle ESB开源项目dll版本号问题

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

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

2、设计缺陷

如上图2设计图,開始设计时。ESB Server公布消息,MainClient接收,然后MainClient再发送给各个显示终端。同一时候显示终端也能够将消息又一次发送给ESB Server。这个过程中。一共启动了两个ESB实例(不包含ESB Server),原因是:

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

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

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

一、ESB实例启动时。须要启动大量的相关服务,这是比較耗时间的。

登录时启动两个实例,非常不明智;

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

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

解决方式非常easy,既然启动两个不行,并且费力不讨好,那么去掉MainClient的服务总线实例,让显示终端直接监听Shuttle ESB Server的消息,也可以正常实现。

3、组件不识别资源

原错误信息例如以下:

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

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

思路非常easy,因为总是报错照不到资源,我就将全部项目的生成路径更改到每一个项目的debug下。项目就能正常执行。只是详细是哪个资源导致的不识别,就不知道了,我也没有深入研究。

4、正常的系统,不稳定

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

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

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

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

因为系统登录时。须要载入一堆服务,并且须要启动ESB实例。很耗时。

用户体验很不好。

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

长处:用多线程来优化程序。降低启动时间,增强用户体验。

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

6、使用Oracle 数据库表队列

眼下,Shuttle ESB提供三种队列支持:MSMQ、SqlServer基于表的队列和RabbitMQ。眼下项目中使用的是SqlServer基于表的队列。

假设想换成Oracle,必须自己写,没时间。

7、集成后不好调试

将Shuttle ESB集成到项目中后,仍需处理大量的业务数据以及相关逻辑。

我这里推断的一些报警。还须要与规则引擎想结合,进行推断。

同一时候。ArcGis地图界面,业务逻辑在不断变化,他们也须要不断作出调整。

数据的来源端C++端也在处在开发期间。它也须要与规则引擎交互……

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

费时费力啊。

过了几天后。我实在无法忍受了。由于这样。我就干不了别的活了。然后。我将全部与Shuttle ESB交互的地广场。所有附加的错误处理。写在明显的错误,此。我做了一个小测试,发现少了一些。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Shuttle ESB(六)——在工程中的应用的更多相关文章

  1. Shuttle ESB

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

  2. unity导出工程导入到iOS原生工程中详细步骤

    一直想抽空整理一下unity原生工程导入iOS原生工程中的详细步骤.做iOS+vuforia+unity开发这么长时间了.从最初的小小白到现在的小白.中间趟过了好多的坑.也有一些的小小收货.做一个喜欢 ...

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

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

  4. Shuttle ESB(一)——入门实例

    下载Shuttle ESB 从GitHub项目公布页,下载最新的公布版本号. Shuttle-ESB源代码包列表:http://www.nuget.org/packages?q=shuttle-esb ...

  5. 把 Reative Native 47 版本集成到已有的 Native iOS 工程中

    一.搭建开发环境 http://reactnative.cn/docs/0.46/getting-started.html#content 二.创建一个模板 运行以下命令,创建一个最新版本的 reac ...

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

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

  7. 初步了解Shuttle ESB

    ESB:EnterpriseService Bus,即企业服务总线.它是传统中间件技术与XML.Web服务等技术结合的产物.从面向服务体系架构发展而来. ESB採用了"总线"这种模 ...

  8. Shuttle ESB实现消息推送

    ESB全称Enterprise Service Bus,即企业服务总线.它是传统中间件技术与XML.Web服务等技术结合的产物. ESB的出现改变了传统的软件架构,能够提供比传统中间件产品更为便宜的解 ...

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

    上一篇文章中,介绍了Shuttle ESB架构模型中的三个重要部分. 今天,我们继续介绍剩余的三个内容:模式和消息路由. 四.模式 Request/Response(请求/响应模式) 对基于Reque ...

随机推荐

  1. NSCache使用常见错误

    NSCache用来存储缓存数据的时候.和NSDictionary功能类似, 可是NSCache有一个特别的问题: 一旦接收到内存警告之后,假设使用[NSCache removeAllObjects]处 ...

  2. POI操作Excel常用方法总结 分类: B1_JAVA 2013-08-23 10:01 349人阅读 评论(0) 收藏

    转载自:http://blog.csdn.net/xjun15/article/details/5805429     一. POI简介               Apache POI是Apache ...

  3. Android AIDL 小结

    1.AIDL (Android Interface Definition Language ) 2.AIDL 适用于 进程间通信,并且与Service端多个线程并发的情况,如果只是单个线程 可以使用 ...

  4. C++中回调(CallBack)的使用方法(其实就是类方法指针,我觉得你的方法易用性不好,虽然原理正确)

    回调函数是一个很有用,也很重要的概念.当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数.回调函数在windows编程使用的场合很多,比如Hook回调函数:MouseProc,GetMsgP ...

  5. springMVC返回json数据乱码问题及@RequestMapping 详解

    原文地址:https://blog.csdn.net/u010127245/article/details/51774074 一.@RequestMapping RequestMapping是一个用来 ...

  6. JFinal redis cluster集群插件

    JFinal redis cluster集群插件 JFinal 框架到了2.1版本号,可是依旧仅仅支持redis的主从集群,没有看到Cluster集群的插件.笔者照着主从的插件方式,改了改,实现了个简 ...

  7. 前端怎么用js模拟应用 JSON-通俗易懂

    前端怎么用js模拟应用 JSON-通俗易懂,这是转载额 好多孩子 弄不明确复杂的json 格式的应用,以下从基础来看一看JSON.怎么玩, 事实上结构理解清了,写起来比html还爽吧. 0.前言   ...

  8. 细说Oracle中NULL值

    1.NULL是什么? NULL表示UNKNOW(未知),其不代表不论什么值. 比如一行中某列没有不论什么值即为NULL. ORACLE同意不论什么一种数据类型的字段为空,除了下面两种情况: 1)主键字 ...

  9. 机器学习 Softmax classifier (无隐含层)

    程序实现 Softmax classifer, 没有隐含层, f=wx+b y=efi∑jefj %% Softmax classifier function Out=Softmax_Classifi ...

  10. ssh连接上腾讯云、华为云Linux服务器,一会就自动断开

    客户端向服务端发送心跳 依赖 ssh 客户端定时发送心跳,putty.SecureCRT.XShell 都有这个功能. Linux / Unix 下,编辑 ssh 配置文件: # vim /etc/s ...