天天看点

分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一、分布式消息总线二、基于Socket的实现三、实现一个简单的例子四、验证效果五、源代码下载六、问题反馈

     在很多MIS项目之中都有这样的需求,需要一个及时、高效的的通知机制,即比如当使用者A完成了任务X,就需要立即告知使用者B任务X已经完成,在通常的情况下,开发人中都是在使用者B所使用的程序之中写数据库轮循代码,这样就会产品一个很严重的两个问题,第一个问题是延迟,轮循机制要定时执行,必须会引起延迟,第二个问题是数据库压力过大,当进行高频度的轮循会生产大量的数据库查询,并且如果有大量的使用者进行轮循,那数据库的压力就更大了。

     那么在这个时间,就需要一套能支持发布-订阅模式的分布式消息总线,那这个问题就可以很好的解决了,比如采用一些成熟的消息总线进行实现,比如MSMQ或者采用比如开源的NServiceBus的发布订阅机制就可以实现处理这种需求,其系统结构就会变成如下所示:

分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一、分布式消息总线二、基于Socket的实现三、实现一个简单的例子四、验证效果五、源代码下载六、问题反馈

    本分布式消息总线,目前广泛的被应用于分布式缓存的更新通知,当在N百台客户短在使用缓存的过程之中,某个操作修改了缓存的数据,必须会导致其他终端缓存的失效,那么使用基于Socket的分布式消息总线之后,我们可以做了修改了即可实时通知,做到缓存数据保持最新,再比如医疗应用之中的危急值管理,当发现检验、检查危急值之后,需要及时通知病区启动声光报警系统等,提醒医护工作人员及相关领导做出相应的措施,再比如应用于异构系统整合,当检验系统做出检验报告,通过消息总线进行发布,HIS系统则即时会收到检验报告数据而实现系统的整合。

     目前能够实现发布订阅模式的开源产品非常之多,为什么还要制造轮子呢,其主要原因有以下几点

     1)像NServiceBus这种东西基于MSMQ,在大量的发布者-订阅者的情况下性能不佳。

     2)此类东西太过于庞大、不易使用和配置。

     3)学习成本过高。

     那为什么要使用Socket技术进行实现呢,其主要原因是有以下几点:

     1)使用高效的Socket通信技术,高效、支持更多的客户端。

     2)使用简单,不需要定义太多额外的东西,只需要定义主题和消息即可使用。

     目前本发布订阅框架并直接集成于AgileEAS.NET SOA Socket通信框架之中并且随其一并发布,下面简单介绍一下其API:

在本框架之中定义了一个消息总线接口IMessageBus:

    IMessageBus就基于Socket发布订阅消息总线的灵魂接口,也是基唯一的发布者调用者功能入口,也就是说不管你是发布者还是订阅者都需要调用这个接口,如果你是发布者请调用IMessageBus接口的Publish方法向消息总线发布消息,如果是你订阅者请通过IMessageBus的订阅方法进行订阅,当你订阅了某个主题之后,有发布者发布该主题的消息,你即可以收到消息并调用订阅回调函数进行处理。

     现在我们开始一个简单的应用消息总线的例子,本例子代码解决方案由下图4个项目组成:

分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一、分布式消息总线二、基于Socket的实现三、实现一个简单的例子四、验证效果五、源代码下载六、问题反馈

     其中:Demo.Messages项目定义发布者、订阅者所使用的消息对象和消息主题。

                Demo.Publisher项目为发布者代码。

                Demo.Subscriber项目为订阅者代码。

                Demo.Server项目为服务端代码。

     在Demo.Messages项目之中,我们定义了一个消息Message:

     消息Message很简单,只有一个属性ID,同时 还需要定义一个消息主题:

     我们定义了一个消息主题为“演示消息”。

     在Demo.Publisher项目之中,没有太多额外的代码,只有在Program.cs写了以下简单的调用代码:

     从IOC容器获取一个消息总线IMessageBus对象,并调用Publish函数发布消息”bus.Publish(Demo.Messages.Topics.DEMO_TOPIC, m);“。

     当然了,使用了IOC容器,就离来开配置文件了,其App.config文件内容如下:

     在Demo.Subscriber项目之中,使用与Demo.Publisher一模一样的配置文件,其Program.cs代码如下:

     其中代码bus.Subscribe(new Program(), "Subscriber1", Demo.Messages.Topics.DEMO_TOPIC, MessageNotify);:完成把消息订阅到MessageNotify通知函数之中。

     在Demo.Server项目之中,启动服务器并且开始接收订阅和发布:

     到此为止,所有代码均已完成,是不是很简单,接下来,我们跑起来验证一下效果。

     我们在编译输入目录Publish下先启动Demo.Server.exe,再启动两个Demo.Subscriber.exe,再启动一个Demo.Publisher.exe,在Demo.Publisher.exe控制台按回车键:

分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一、分布式消息总线二、基于Socket的实现三、实现一个简单的例子四、验证效果五、源代码下载六、问题反馈

OK,搞定。

     麻烦大家在通过视频进行学习的时候能及时把问题反馈给楼主,或者有什么需要改进的一些建议都请向楼主直接反馈,以下是联系方式:

楼主QQ:47920381,AgileEAS.NET

QQ群:113723486(AgileEAS SOA 平台)/上限1000人

199463175(AgileEAS SOA 交流)/上限1000人

120661978(AgileEAS.NET 平台交流)/上限1000人

邮件:[email protected],[email protected],

电话:18629261335。