博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
消息智能路由组件SmartRoute
阅读量:6705 次
发布时间:2019-06-25

本文共 4128 字,大约阅读时间需要 13 分钟。

  hot3.png

         消息传递在软件开发过程中是一件很常见的事情,而在不同的场景所使用消息传递方式也有所不同,在对象之间制定相关接口方法和对象结构,对于进程之间可能使用内存共享或一些通讯产品,在不同服务器之的消息通讯则使用一些通讯产品(MQ)或构建满足自己的RPC通讯机制.不同场景技术人员都要掌握不同的技术方法来实现,由于应用技术和差异性容易导致开发成本和维护成本的上涨,为了解决这一系列的问题在这段时候思考后实现一种统一的消息传递方式,而这种应用方式不管是对象间,进程或服务器在应用上都不会任何差,在这里称这技术为消息智能路由(为了快速验证想法,大概花了一周的业余时间制定了一个可用的原型).

SmartRoute可实现场景

如何智能?

         SmartRoute是依据订阅者的ID来进行消息发送传递,类似于邮件地址一样;只要在订阅的时候制定相应的接收实现即可接收投递到这一ID的消息.然而这方式非常普通并没有什么所谓智能高大上在这里.其实SmartRoute的智能优点在于技术人员完全不用去关心订阅者所在的位置,不管是当前程序,其他应用程序还是其他服务器,SmartRoute都可以自动地帮你投递过去.最重要的是技术人员完全不用配置任何环境和安装任何中间服务,只需要在程序中加载SmartRoute这系列的工作都可以自动完成(没错,即使你是跨服务器投递消息也不需要做额外的配置和安装中间服务器);每个SmartRoute实例除承担着接收和投递工作的同时也承担了消息路由的角色;不同进程和不同服务器运行的SmartRoute实例会自动组建集群(而这个自动构建也不需要配置或安装服务)

Hello应用

         一个组件的易用性才能体现它的价值,所以在设计SmartRoute的时候就遵循一个原则,在应用中尽量做到不需要配置即可用.以下通过通过简单的Hello程序来描述一下组件设计的易用性.

l  HelloRequest

class Request : ISubscribeHandler    {        public Request()        {            Route.Subscribe("Ken", this);        }        public DateTime CreateTime        {            get;            set;        }        public void Say(string name)        {            Hello hello = new Hello { Name ="hello "+ name };            hello.SendTo(s => s.From("Ken"), "henry");        }        public ILogHandler Log        {            get;            set;        }        public void Process(INode node, IMessage message)        {            Hello hello = message.GetBody
(); Console.WriteLine("{0} Request receive:{1}",DateTime.Now, hello.Name); } }

l  HelloReqponse

class Response : ISubscribeHandler    {        public Response()        {            Route.Subscribe("henry", this);        }        public DateTime CreateTime        {            get;            set;        }        public ILogHandler Log        {            get;            set;        }        public void Process(INode node, IMessage message)        {            Hello hello = message.GetBody
(); Console.WriteLine("{0} response receive:{1}",DateTime.Now, hello.Name); hello.Name = "hello " + message.Sender; hello.SendTo(message.Sender); } }

Request和Response各自订阅了信息,通过实现ISubscribeHandler来接收投递过来的消息.可以通过运行以下代码来测试订阅的有效性.

class Program    {        static Request request;        static Response response;        static void Main(string[] args)        {            request = new Request();            response = new Response();            while (true)            {                request.Say("henry");                System.Threading.Thread.Sleep(3000);            }        }    }

l  运行结果

扩展进程间通讯

         对于SmartRoute对现有的订阅进行跨进程访问则是一件非常简单的事件,并不需要修改或配置任何代码即可完成.下面分别建两个程序分别引用HelloRequest和HelloResponse

l  HelloRequestApp

class Program    {        static Request request;        static void Main(string[] args)        {                      request = new Request();            while (true)            {                request.Say("henry");                System.Threading.Thread.Sleep(3000);            }        }    }

l  HelloResponseApp

class Program    {              static Response response;        static void Main(string[] args)        {                       response = new Response();            System.Threading.Thread.Sleep(-1);        }    }

l  运行结果

服务器间通讯

         SmartRoute在同一个局域网内会自动发现和组建路由,所以在不调整任何设计和代码的情况下,只需要把两个应用部署在不同服务器就可以进行信息订阅和发送.

技术要点

l  通信功能

除了本进程内订阅和转发不需要涉及到通讯外,进程和服务器间都需要通讯服务.所以做这样一个功能需要点通讯技术经验,不过现在成熟的开发的通讯库也有不少可以直接拿来用.

l  节点发现和握手

组件的灵活之处就是不需要任何配置就能实现交互,所以每个节点都具备发其他节点的能力;为了满足这一需求需要使用UDP广播技术,每个节点都会把自己的服务信息广播出去,当其他节点接收到这些信息后就创建握手连接.

l  同步订阅信息

由于在设计的过程中强调没有数据中心点,就是整个集群里的所有节点都是相互直连的.所以每个节点的订阅信息都会同步到不同节点上,这样才能保证消息投递的有效性.为了保证订阅的有效性同样订阅取的时候需要告诉其他节点变更情况.

l  制定订阅规则

订阅在接收消息处理的情况是多样性的,有可能是操作数据库,HTTP或者网络转发;所以需要给订阅制定规划,让使用者可以实现不同的订阅处理.

以下是一个简单网络转发订阅

public class TCPSubscribeHandler : ISubscribeHandler    {        public ILogHandler Log { get; set; }        public IChannel Channel        {            get;            set;        }        public void Process(INode node, IMessage message)        {            Channel.Server.Send(message,Channel);        }        public DateTime CreateTime        {            get;            set;        }    }

转载于:https://my.oschina.net/ikende/blog/493533

你可能感兴趣的文章
HP官方提供的LR在线基础视频教程
查看>>
yii 隐藏index.php
查看>>
OEA框架学习:使用动软代码生成器
查看>>
【编程范式】汇编解释swap方法
查看>>
[置顶] LLVM每日谈之十五 LLVM自带的examples
查看>>
2013下半年-学习目录
查看>>
网速4M等于多少KB/S,等于多少kbps
查看>>
MySQL MERGE存储引擎 简介
查看>>
asp.net mvc3 数据验证(二)——错误信息的自定义及其本地化
查看>>
用vs2013开发node.js的addon.
查看>>
atitit。自己定义uml MOF EMF体系eclipse emf 教程o7t
查看>>
atitit.taskService 任务管理器的设计 v1
查看>>
编写jquery插件的分享
查看>>
机器学习 —— 概率图模型(学习:对数线性模型)
查看>>
2016百度编程题:蘑菇阵
查看>>
解决教学问题新感悟
查看>>
nyoj 37 回文字符串
查看>>
Lintcode--006(交叉字符串)
查看>>
ASP.NET Core 1.0基础之依赖注入
查看>>
Excel里的单元格提行
查看>>