消息传递在软件开发过程中是一件很常见的事情,而在不同的场景所使用消息传递方式也有所不同,在对象之间制定相关接口方法和对象结构,对于进程之间可能使用内存共享或一些通讯产品,在不同服务器之的消息通讯则使用一些通讯产品(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<Hello>();
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<Hello>();
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;
}
}

下载DEMO

消息智能路由组件SmartRoute的更多相关文章

  1. Net Core开源通讯组件 SmartRoute

    Net Core开源通讯组件 SmartRoute(服务即集群) SmartRoute是基于Dotnet Core设计的可运行在linux和windows下的服务通讯组件,其设计理念是去中心化和零配置 ...

  2. rabbitmq消息队列——"路由"

    在之前的教程中,我们创建了一个简单的日志系统.我们能够向许多交换器转发日志消息. 在本教程中,我们将添加一个功能--我们让它仅仅接收我们感兴趣的日志类别.举例:我们 实现仅将严重级别的错误日志写入磁盘 ...

  3. beego 0.9.0 中智能路由AutoRouter的使用方法及源码解读

    了解beego的开发者肯定知道,beego的路由设计来源于sinatra,原来是不支持自动路由的,每一个路由都要自己配置的,如: type MainController struct { beego. ...

  4. vue_VueRouter 路由_路由器管理n个路由_并向路由组件传递数据_新标签路由_编程式路由导航

    路由:就是一个 key 与 value 的映射关系.key 就是 pathh 前台路由的 value 是 Component 组件对象 后台路由的 value 是一个 回调函数 普通链接: 会发送请求 ...

  5. Vue-admin工作整理(四):路由组件传参

    路由组件传参:如果在一个页面中,需要根据路由去获得参数,去对页面进行一些逻辑处理,首先可以通过this.$router来获取路由实例的参数,这样页面组件和路由就进行了耦合,为了进行分离,更大程度复用, ...

  6. VueJs(11)---vue-router(命名路由,命名视图,重定向别名,路由组件传参)

    vue-router 上篇文章讲了第一篇vue-router相关文章,文章地址:VueJs(10)---vue-router(进阶1) 一.命名路由 有时候,通过一个名称来标识一个路由显得更方便一些, ...

  7. vue-router之路由钩子(组件内路由钩子必须在路由组件调用,子组件没用)

    模式 vue-router中的模式选项主要在router实例化的时候进行定义的,如下 const router = new VueRouter({ mode: 'history', // 两种类型hi ...

  8. DRF 视图组件,路由组件

    视图组件  -- 第一次封装   -- GenericAPIView(APIView):    queryset = None    serializer_class = None    def ge ...

  9. ARouter 路由 组件 跳转 MD

    目录 简介 支持的功能 典型应用 简单使用 进阶使用 更多功能 其他 Q&A Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs bai ...

随机推荐

  1. Java实现中文数字转换为阿拉伯数字

    /** * 中文數字转阿拉伯数组[十万九千零六十 --> 109060] * @author 雪见烟寒 * @param chineseNumber * @return */ @Suppress ...

  2. [NOIP2015]信息传递

    [NOIP2015]信息传递[问题描述]有

  3. eclipse配置javaee环境

    笔者开发javaee项目时惯用myeclipse,但由于个人笔记本性能较低,myeclipse对内存的消耗极大,所以考虑换成eclipse开发.本文介绍eclipse配置javaee开发环境的一些体会 ...

  4. ue4 plugin的编译加载

    插件Plugin: 本来应该是指一种纯以接口与外界打交道的程序模块,在同一接口背后可以有多种实现,更换实现完全不影响客户端代码(不用重编). 但是在ue4的世界里,插件似乎不是这个意思,仅仅是一种可以 ...

  5. Windows XP发行12周年,我正步入中年,你已垂暮

    2001年10月25日,Windows XP正式全球上市!作为Windows 2000的升级版本,XP拥有大量新的功能:新的用户界面.防火墙整合等,这些都大大的增强了系统的易用性和安全性.而微软将于2 ...

  6. windows下监测tomcat7内存使用情况

    在conf里面的server-user文件里添加 <tomcat-users> <role rolename="admin-gui"/> <user ...

  7. Ajax参数详解

    1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如 ...

  8. 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings

    谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...

  9. 图片浏览(CATransition)转场动画

    Main.storyboard ViewController.m // //  ViewController.m //  8A04.图片浏览(转场动画) // //  Created by huan ...

  10. css中怎么设置透明度的问题

    小伙伴们是不是在找怎么样去设置页面的透明度的方法呢...别找了,我这儿就有,而且肯定够用了. 我自己会用到的就有两种,可以和大家分享一下. 1.用opcity的方法去设置透明度.代码如下: .div ...