smartroute集成聊天通信集羣

        在制定一個規模比較多大的聊天應用時,每每須要制定部署多個應用服務,其一能夠保障服務的可靠性,其二能夠增長用戶負載量.但制定這樣一種應用體系是一件複雜的事情,畢竟同一羣體的用戶實際上會在不一樣的服務器接入,這樣信息轉發和處理就是一件比較麻煩的事情.但經過smartroute的訂閱機制這一系列的事情都變得簡單. 服務器

         依據客觀狀況在設計的時候通常都只是功能優先,對於大規模的應用每每是後期擴展.可是基於集羣擴展在設計上就須要作得不少工做做和規劃.然而使用smartroute則會變得很是簡單,由於並不須要在設計和規劃上作多餘的工做便可實現跨服務器集羣交互.也許你感受這是不太可能的事情,但如下示例會讓你感受到smartroute的智能之處. 網絡

  

       對於以上場景設計須要考慮的事情比較多除了考慮節點和節點的通信外,還須要考慮用戶所登錄的節點,消息如何路由轉發和增長節點須要如何切入集羣等複雜技狀況.而用smartroute不須要安裝任何服務和配置便可自動完成,接下來看下若是使用smartroute來解決一些看去都很複雜的工做. 架構

集羣服務端實現

        如是一開始上面架構規劃設計,那確定是很複雜的工做,那加入smartroute後的設計到底怎樣呢? tcp

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

        你沒有看錯,以上代碼就是一個基於集羣的簡單聊天服務網關,看上去是否是比編寫一個普通網絡程序的來得更簡單多.接下來說解一下主要代碼的做用. spa

        註冊訂閱 設計

                當網關接受到接入的時候會向節點註冊一個訂閱Route.Subscribe(e.Channel.ID, tcpsub);,而訂閱的ID則鏈接在當前服務的惟一標識,而訂閱實現是一個TCP鏈接訂閱. code

        取消訂閱 server

                當網關接受到斷開的時候則取消訂閱 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中統一集成分發.

下載完整示例代碼

相關文章
相關標籤/搜索