博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
异步tcp通信——APM.Server 消息推送服务的实现
阅读量:5049 次
发布时间:2019-06-12

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

消息推送服务

  服务器推送目前流行就是私信、发布/订阅等模式,基本上都是基于会话映射,消息对列等技术实现的;高性能、分布式可以如下解决:会话映射可采用redis cluster等技术实现,消息对列可使用kafka等分布式消息队列方案实现。

  APM.Server基于简单

1 static ConcurrentDictionary
_sessionDic = new ConcurrentDictionary
();

 

1 private static ConcurrentQueue
_messageQueue = new ConcurrentQueue
();

 

实现。

  部分代码如下:

1 ///  2         /// 消息转发 3         ///  4         private void ForwardMsg() 5         { 6             try 7             { 8                 var msg = MessageQueue.Dequeue(); 9                 if (msg != null)10                 {11                     switch (msg.Type)12                     {13                         case (byte)MessageType.Sub:14                             if (!msg.IsMuti)15                             {16                                 if (!SessionDic.Exists(msg.SessionID, msg.SessionID))17                                     SessionDic.Set(this._server, msg.SessionID, msg.SessionID);18                             }19                             if (!SessionDic.Exists(msg.SessionID, msg.Sender))20                                 SessionDic.Set(this._server, msg.Sender, msg.SessionID);21                             break;22                         case (byte)MessageType.Unsub:23                             if (!msg.IsMuti)24                             {25                                 if (SessionDic.Exists(msg.SessionID, msg.SessionID))26                                     SessionDic.Del(msg.SessionID, msg.SessionID);27                             }28                             if (SessionDic.Exists(msg.SessionID, msg.Sender))29                                 SessionDic.Del(msg.Sender, msg.SessionID);30                             break;31                         default:32                             var session = SessionDic.Get(msg.SessionID);33                             if (session != null)34                             {35                                 var remotes = session.UserTokenDic.List.Where(b => b.ID != msg.Sender).ToList();36                                 if (remotes != null && remotes.Count > 0)37                                 {38                                     Parallel.For(0, remotes.Count, i =>39                                     {40                                         this._server.SendMsg(remotes[i], Message.Serialize(msg));41                                     });42                                 }43                             }44                             this.OnMessage?.Invoke(msg);45                             break;46                     }47 48                 }49             }50             catch { }51         }
View Code

 

转载请标明本文来源:
更多内容欢迎star作者的github:
如果发现本文有什么问题和任何建议,也随时欢迎交流~

 

转载于:https://www.cnblogs.com/yswenli/p/6266084.html

你可能感兴趣的文章
Qt中QTableView中加入Check列实现
查看>>
“富豪相亲大会”究竟迷失了什么?
查看>>
控制文件的备份与恢复
查看>>
返回代码hdu 2054 A==B?
查看>>
Flink独立集群1
查看>>
iOS 8 地图
查看>>
20165235 第八周课下补做
查看>>
[leetcode] 1. Two Sum
查看>>
iOS 日常工作之常用宏定义大全
查看>>
PHP的SQL注入技术实现以及预防措施
查看>>
MVC Razor
查看>>
软件目录结构规范
查看>>
Windbg调试Sql Server 进程
查看>>
linux调度器系列
查看>>
mysqladmin
查看>>
解决 No Entity Framework provider found for the ADO.NET provider
查看>>
SVN服务器搭建和使用(三)(转载)
查看>>
Android 自定义View (三) 圆环交替 等待效果
查看>>
设置虚拟机虚拟机中fedora上网配置-bridge连接方式(图解)
查看>>
HEVC播放器出炉,迅雷看看支持H.265
查看>>