文档章节

消息智能路由组件SmartRoute

泥水佬
 泥水佬
发布于 2015/08/17 15:57
字数 1419
阅读 208
收藏 2
点赞 0
评论 1

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

SmartRoute可实现场景

如何智能?

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

Hello应用

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

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);
        }
    }

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);
        }
    }

RequestResponse各自订阅了信息,通过实现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对现有的订阅进行跨进程访问则是一件非常简单的事件,并不需要修改或配置任何代码即可完成.下面分别建两个程序分别引用HelloRequestHelloResponse

HelloRequestApp

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

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

© 著作权归作者所有

共有 人打赏支持
泥水佬

泥水佬

粉丝 63
博文 74
码字总数 41338
作品 6
广州
架构师
加载中

评论(1)

红薯
红薯
建议把代码放到 git.oschina.net 上
SmartRoute应用-helloWorld示例

本章主要是通过helloWorld来介绍SmartRoute组件的使用,SmartRoute和一般的通讯组件使用方式用点差别,使用方式主要强调就用零配置和零安装即可用.在传统通讯应用中需要开启服务端然后由另一方...

泥水佬
2015/08/24
0
0
smartroute集成聊天通讯集群

在制定一个规模比较多大的聊天应用时,往往需要制定部署多个应用服务,其一可以保障服务的可靠性,其二可以增加用户负载量.但制定这样一种应用体系是一件复杂的事情,毕竟同一群体的用户实际上会...

泥水佬
2015/08/26
0
0
基于 Dotnet Core 的服务通讯组件--SmartRoute

SmartRoute 是基于Dotnet Core设计的可运行在linux和windows下的服务通讯组件,其设计理念是去中心化和零配置即可实现服务通讯集群。SmartRoute是通过消息订阅的机制实现服务与服务之间的通讯...

泥水佬
2016/11/08
1K
2
.Net Core开源通讯组件 SmartRoute(服务即集群)

SmartRoute是基于Dotnet Core设计的可运行在linux和windows下的服务通讯组件,其设计理念是去中心化和零配置即可实现服务通讯集群。SmartRoute是通过消息订阅的机制实现服务与服务之间的通讯...

泥水佬
2016/11/08
99
0
SmartRoute零配置零安装实现分布式负载应用

随着应用规模的增长服务则需要扩展集群休部署,在集群化部署过程首先要考虑服务负载处理的问题,在实现应用场中有很多集群化的负载方式,如网络通讯层面的LVS,HTTP应用协议层面的nginx.然而这...

泥水佬
2016/01/14
174
0
【Spring Cloud】分布式必学springcloud(一)——简介和看法

一、前言 开篇之前,我想说,springcloud会完胜dubbo。 小编以前做分布式是用的webservice、dubbo。最近的项目中,开始使用了springcloud,springcloud包含了很多的组件,这些组件是dubbo没有...

kisscatforever
04/16
0
0
规则引擎--Apache Camel

Apache Camel 是一个非常强大的基于规则的路由以及媒介引擎,该引擎提供了一个基于POJO的 企业应用模式(Enterprise Integration Patterns)的实现,你可以采用其异常强大且十分易用的API (可以...

匿名
2008/09/21
32.2K
5
Apache Camel 2.20 发布,对 Java 9 技术预览支持

Apache Camel 2.20 发布了。 该版本有以下改进: Java 9 技术预览支持 改善启动时间 优化核心,减少冗余 改进了 Spring Boot 的支持,正在准备 Spring Boot 2 的实现 改进了Spring 的生命周期...

周其
2017/10/13
1K
0
Redux 最佳实践

摘要 Redux 是 其他 flux 框架 推荐使用的 React 框架。当我开始写这篇文章时,它还是 1.0.0 版本,当这篇文章发布时,它已经是 3.0.0 了。 它的作者,Dan Abramov 已经发布一些很棒的 文档,...

力谱宿云
2016/06/21
731
1
Apache Camel 2.10 发布

Apache Camel 2.10 更新版发布了,增加对 WebSocket 和 Twitter 的支持。 Apache Camel 是一个非常强大的基于规则的路由以及媒介引擎,该引擎提供了一个基于POJO的 企业应用模式(Enterprise...

oschina
2012/10/10
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Django时区详解

引言 相信使用Django的各位开发者在存储时间的时候经常会遇到这样子的错误: RuntimeWarning: DateTimeField received a naive datetime while time zone support is active. 这个错误到底...

bobway
7分钟前
0
0
改造工程步骤

背景: 对于存在有问题的项目(包括 代码不规范 数据库表命名不规范 )需要改造 步骤: 1 新建工程 : 将需要改造的项目拷贝一份 修改项目名称 2 将相应的表结构拷贝到新的数据库中 修改不直...

猿神出窍
14分钟前
0
0
node报错{ xxx, xxx}

nodemon 启动语法报错 重新打开项目node代码报错,在node4.4.2下报错,把node版本切换到6就没有问题

x29
16分钟前
0
0
防火墙未来的发展趋势在哪里?

防火墙(Firewall),也称防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网。当下互联网时代,无论是大小企业,大部分都会部署有防火墙的设备,但这些防火墙往往并不是都利...

六库科技
17分钟前
0
0
Elasitcsearch High Level Rest Client学习笔记(二) 基础API

1、index API IndexRequest request = new IndexRequest( "posts", //index "doc",  //type 类型,我对类型的理解有点类似于数据库中的表 index类似于数据库中的datab...

木子SMZ
19分钟前
0
0
[DUBBO] Ignore empty notify urls for subscribe url

学习dubbo,按照官方文档编写了 provider consumer 使用的注册中心是Multicast 多播(组播),报了上面的警告,客户端服务端都有类似的警告,并且服务消费者不能发现服务。网上找了各种解决办...

颖辉小居
32分钟前
0
0
unorder_map 随机元素

对于hash的结构来说 思路1:直接随机内部list 即可,但是数据量大的话 iter 要定位起来是个很麻烦的事情 思路2:先随机到一个可用bucket 然后再里面随机一个元素即可

梦想游戏人
37分钟前
0
0
g++编译过程

gcc & g++现在是gnu中最主要和最流行的c & c++编译器 。 g++是将默认语言设为c++,链接时自动使用C++标准库而不用 c标准库 C++标准库:http://www.runoob.com/cplusplus/cpp-standard-librar...

SibylY
39分钟前
0
0
docker更换镜像源

国内下载docker镜像大部分都比较慢,下面给大家介绍2个镜像源。 一、阿里云的docker镜像源 注册一个阿里云用户,访问 https://cr.console.aliyun.com/#/accelerator 获取专属Docker加速器地址...

xiaomin0322
40分钟前
0
0
7.07-获取多少天之前(之后)的日期

public String getDate(Date date,int days){ Calendar calendar=Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DATE,days); ......

静以修身2025
42分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部