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

本文共 2813 字,大约阅读时间需要 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:
如果发现本文有什么问题和任何建议,也随时欢迎交流~

 

你可能感兴趣的文章
【SAS NOTE】用file+put实现结果输出
查看>>
diff 与patch
查看>>
wget简单使用
查看>>
【推荐】捕获WCF服务端与客户端产生的通讯数据并分析
查看>>
中国政法大学具体位置在哪?
查看>>
Extjs textfield keyup事件
查看>>
一个在线预览所有原生 HTML5 表单元素效果的网站
查看>>
百度地图 测距
查看>>
POJ-2400 Supervisor, Supervisee 带权值匹配+枚举所有匹配情况
查看>>
修改Oracle表空间的大小
查看>>
在JXSE中,DHT=SRDI
查看>>
深入理解 NodeList
查看>>
PLSQL 操作 ORACLE 服务器上的文件
查看>>
Windows 8 应用商店应用开发 之 轮廓样式
查看>>
标记页面CSS样式表初解
查看>>
最近对WinForm与控制台程序的了解
查看>>
文档问题机房合作项目总结-心里导航
查看>>
应用清除打车APP加价惹争议 政府责令清除
查看>>
高清精美壁纸:2013年6月桌面日历壁纸免费下载
查看>>
Word2003文档打不开怎么办?1分钟帮你解决!
查看>>