文档章节

smartroute集成聊天通讯集群

泥水佬
 泥水佬
发布于 2015/08/26 21:59
字数 1182
阅读 438
收藏 6
点赞 0
评论 0

        在制定一个规模比较多大的聊天应用时,往往需要制定部署多个应用服务,其一可以保障服务的可靠性,其二可以增加用户负载量.但制定这样一种应用体系是一件复杂的事情,毕竟同一群体的用户实际上会在不同的服务器接入,这样信息转发和处理就是一件比较麻烦的事情.但通过smartroute的订阅机制这一系列的事情都变得简单.

         依据客观情况在设计的时候一般都只是功能优先,对于大规模的应用往往是后期扩展.但是基于集群扩展在设计上就需要做得很多工作作和规划.然而使用smartroute则会变得非常简单,因为并不需要在设计和规划上做多余的工作即可实现跨服务器集群交互.也许你感觉这是不太可能的事情,但以下示例会让你感觉到smartroute的智能之处.

  

       对于以上场景设计需要考虑的事情比较多除了考虑节点和节点的通讯外,还需要考虑用户所登陆的节点,消息如何路由转发和增加节点需要如何切入集群等复杂技情况.而用smartroute不需要安装任何服务和配置即可自动完成,接下来看下如果使用smartroute来解决一些看去都很复杂的工作.

集群服务端实现

        如是一开始上面架构规划设计,那肯定是很复杂的工作,那加入smartroute后的设计到底怎样呢?

private static IServer mServer;

        static void Main(string[] args)
        {
            
            Route.AddLogHandler(new ConsoleLogHandler(LogType.DEBUG | LogType.ERROR | LogType.FATAL | LogType.INFO | LogType.NONE | LogType.WARN));
            Route.DefaultNode.Open();
            mServer = ServerFactory.CreateTCP();
            mServer.Handler = new Program();
            mServer.Port = 8012;
            mServer.Open();
            System.Threading.Thread.Sleep(-1);
        }

        public void Connect(Beetle.Express.IServer server, Beetle.Express.ChannelConnectEventArgs e)
        {
            TCPSubscribeHandler tcpsub = new TCPSubscribeHandler();
            tcpsub.Channel = e.Channel;
            SmartRoute.Protocol.Packet packet = new SmartRoute.Protocol.Packet();
            packet.Channel = e.Channel;
            packet.Receive = OnMessageReceive;
            e.Channel.Package = packet;
            Route.Subscribe(e.Channel.ID, tcpsub);         
        }

        public void Disposed(Beetle.Express.IServer server, Beetle.Express.ChannelEventArgs e)
        {
            Route.UnSubscribe(e.Channel.ID);
            UnRegister ureg = new UnRegister();
            ureg.IP = e.Channel.EndPoint.ToString();
            ureg.Name = e.Channel.Name;
            ureg.SendTo(s => s.Mode(ReceiveMode.NotEq), e.Channel.ID);
        }

        private void OnMessageReceive(object sender, Beetle.Express.PackageReceiveArgs e)
        {
            IMessage message = (IMessage)e.Message;
            switch (message.MessageType)
            {
                case "Register":
                    Register reg = message.GetBody<Register>();
                    e.Channel.Name = reg.Name;
                    reg.IP = e.Channel.EndPoint.ToString();
                    reg.SendTo(s => s.Mode(ReceiveMode.All), e.Channel.ID);
                    break;
                case "Speak":
                    Speak speak = message.GetBody<Speak>();
                    speak.User = new Register();
                    speak.User.Name = e.Channel.Name;
                    speak.User.IP = e.Channel.EndPoint.ToString();
                    speak.SendTo(s => s.Mode(ReceiveMode.NotEq), e.Channel.ID);
                    break;
            }
        }

        你没有看错,以上代码就是一个基于集群的简单聊天服务网关,看上去是不是比编写一个普通网络程序的来得更简单多.接下来讲解一下主要代码的作用.

        注册订阅

                当网关接受到接入的时候会向节点注册一个订阅Route.Subscribe(e.Channel.ID, tcpsub);,而订阅的ID则连接在当前服务的唯一标识,而订阅实现是一个TCP连接订阅.

        取消订阅

                当网关接受到断开的时候则取消订阅 Route.UnSubscribe(e.Channel.ID);

        发送消息

                而当网关接收到消息的情况则把消息投递出去,reg.SendTo(s => s.Mode(ReceiveMode.All), e.Channel.ID)是投递给所有订阅, speak.SendTo(s => s.Mode(ReceiveMode.NotEq), e.Channel.ID)则投递给非当前Channel.ID的所有订阅

智能组建节点集群

        如果这个服在当前局域网内只运行一个实例,那它紧紧是一个普通的服务端,但如果节点发现网内还有其他节点在运行的情况下则会去发现对方并组建成通讯集群.当组建集群后每个节点的订阅信息都会同步到不同节点下,每个节点都是相互直连不存在中心服务.当一个节点接收一个消息投递的时候会找相应的订阅,如果是本机订阅则会直接调用订阅;如果是订阅在其他节点则把消息投递到相应的节点,由相应的节点调用订阅.

单节点动行效果

    

多节点运行效果

    

    一旦节点发现网内有其它节点就会发现组建集群并同步订阅,一集群组建完成后就可以通过节点进行信息交互.

    

总结

    实际上一个聊天服务的功能并不这么简单,往往具备有大厅,群组等等.其实使用smartrote处理这些信息转发则是非常简单的事情.可以针对大厅,群组制定订阅服务节点;然后消息发送到相关订阅,然后再由这些服务查找出具体的订阅用户然后分发即可.所以smartrote的订阅看上去是很简的功能,实现上可以实现很多意想不到的功能,如FTP,HTTP和MQ等等订阅的实现并注册到smartroute中统一集成分发.

下载完整示例代码

© 著作权归作者所有

共有 人打赏支持
泥水佬

泥水佬

粉丝 63
博文 74
码字总数 41338
作品 6
广州
架构师
基于 Dotnet Core 的服务通讯组件--SmartRoute

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

泥水佬 ⋅ 2016/11/08 ⋅ 2

.Net Core开源通讯组件 SmartRoute(服务即集群)

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

泥水佬 ⋅ 2016/11/08 ⋅ 0

SmartRoute零配置零安装实现分布式负载应用

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

泥水佬 ⋅ 2016/01/14 ⋅ 0

消息智能路由组件SmartRoute

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

泥水佬 ⋅ 2015/08/17 ⋅ 1

SmartRoute应用-helloWorld示例

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

泥水佬 ⋅ 2015/08/24 ⋅ 0

KgCM 金刚客服系统--KgCM

KgCM,金刚C2C/B2B客服系统,一款类似淘宝IM的C2C商城/B2B商城聊天咨询工具,KgCM由网站咨询终端、桌面程序聊天终端(gui)、消息通讯服务器三大组件构成,针对卖家,买家,网店客服开发个性化的...

聚龙软件 ⋅ 2011/11/10 ⋅ 1

ENTBOOST V0.9 发布,开源企业IM,免费企业即时通讯

ENTBOOST V0.9版本发布,更新内容:1.完善多人群组聊天,提高群组聊天性能及稳定性;2.苹果IOS SDK,增加联系人管理功能,优化API和内部流程,修复部分BUG;3.增加企业应用功能集成REST接口,...

akee ⋅ 2014/08/11 ⋅ 23

基于 akka 的 websocket 聊天程序--CookIM

CookIM 一个基于akka的分布式websocket聊天程序,服务端支持多节点间消息通讯。 CookIM支持在docker上运行,运行非常简单: 以Docker方式启动单节点CookIM 获取镜像 $ sudo docker pull coo...

cookeem ⋅ 2016/12/14 ⋅ 1

CookIM - 基于akka的分布式websocket聊天程序,服务端支持多节点间消息通讯

CookIM - 一个基于akka的分布式websocket聊天程序,服务端支持多节点间消息通讯。 演示地址:https://im.cookeem.com 文档地址:https://github.com/cookeem/CookIM/blob/master/README_CN.m...

cookeem ⋅ 2016/12/14 ⋅ 2

企业内部即时通讯工具--Pandion

Gd中国实验室研究表明,通过QQ或者MSN等公众聊天工具传递的大部分信息是无效信息,一些公司不允许员工使用聊天工具,因为担心影响了企业的风气和工作效率。然而发展日趋完善的即时聊天工具是...

匿名 ⋅ 2009/07/22 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用SQL命令查看Mysql数据库大小

要想知道每个数据库的大小的话,步骤如下: 1、进入information_schema 数据库(存放了其他的数据库的信息) use information_schema; 2、查询所有数据的大小: select concat(round(sum(da...

源哥L ⋅ 40分钟前 ⋅ 0

两个小实验简单介绍@Scope("prototype")

实验一 首先有如下代码(其中@RestController的作用相当于@Controller+@Responsebody,可忽略) @RestController//@Scope("prototype")public class TestController { @RequestMap...

kalnkaya ⋅ 45分钟前 ⋅ 0

php-fpm的pool&php-fpm慢执行日志&open_basedir&php-fpm进程管理

12.21 php-fpm的pool pool是PHP-fpm的资源池,如果多个站点共用一个pool,则可能造成资源池中的资源耗尽,最终访问网站时出现502。 为了解决上述问题,我们可以配置多个pool,不同的站点使用...

影夜Linux ⋅ 54分钟前 ⋅ 0

微服务 WildFly Swarm 管理

Expose Application Metrics and Information 要公开关于我们的微服务的有用信息,我们需要做的就是将监视器模块添加到我们的pom.xml中: 这将使在管理和监视功能得到实现。从监控角度来看,...

woshixin ⋅ 55分钟前 ⋅ 0

java连接 mongo伪集群部署遇到的坑

部署mongo伪集群 #创建mongo数据存放文件地址mkdir -p /usr/local/config1/datamkdir -p /usr/local/config2/data mkdir -p /usr/local/config3/data mkdir -p /usr/local/config1/l......

努力爬坑人 ⋅ 56分钟前 ⋅ 0

React Native & Weex 区别

JS引擎 Weex使用V8, React native使用JSCore JS开发框架 ( Js Framework ) Weex基于vue.js(2W+ star)。小巧轻量的前端开发框架,组件化,数据绑定,2.0引入virtual dom。 ReactNative使用...

东东笔记 ⋅ 今天 ⋅ 1

UIkit 分页组件动态加载简单实现

1. 问题描述 使用过UIkit分页组件的都清楚,UIkit的分页不能动态刷新数据,也就是不能在点击下一页的时候,动态从后台加载数据,并且刷新页数以及该页数上的数据,下面是一个简单实现,没有做...

影狼 ⋅ 今天 ⋅ 0

Mobx入门之三:Provider && inject

上一节中<App/>组件传递状态temperatures给children -- <TemperatureInput />,如果组建是一个tree, 那么属性的传递则会非常繁琐。redux使用Provider给子组件提供store, connect将子组件和s...

pengqinmm ⋅ 今天 ⋅ 0

魔兽世界 7.0版本 S23/S24/S25全职业普通+精锐套

  死亡骑士   (联盟)   (部落)   (精锐)   恶魔猎手   (联盟)   (部落)   (精锐)   德鲁伊   (联盟)   (部落)   (精锐)   猎人   (联盟) ...

wangchen1999 ⋅ 今天 ⋅ 0

maven顶级pom和子pom的版本号批量修改

当一个版本发布,新起一个版本时,我们只需要手动修改一下项目中pom.xml的版本号就可以了。但是如果这个maven项目有很多的子模块项目,那么一个个手动的去改就显得费时费力又繁琐了。还好,m...

ArlenXu ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部