这一类的IM,先从用户的角度去分析,用户只会存在最多一个房间,不会同时收到很多房间消息。用户观看的途径,又分为网页和手机APP,这里就需要构建两个socket的通信,分别是tcpsocket和websocket。
tcpsocket和websocket的区别,tcpsocket是通过tcp,三次握手建立连接,而websocket则是通过http一次握手建立连接的,这两种socket传输的协议也有区别,netty包装了websocket的通信协议,这个就只需要自己定义tcpsocket的通信协议。
个人建议IM与IM之间不直接发生交互,也不与数据库发生交互,通过分发器去交互,其他业务模块对接IM,也只需要和分发器对接就行了,websocket的IM也尽量去tcpsocket的IM独立开,大致的图如下

在这里,当用户链接上IM的时候,可以在redis中记录用户与IM的关系,房间与IM的关系,IM与房间的关系,IM与用户的关系
用户与IM的关系:当做用户与用户的点对点通信的时候,分发器可以通过用户与IM的关系知道某个用户在哪个具体的IM上,直接向这个IM交互
房间与IM的关系:当做房间广播通信的时候,分发器可以通过房间与IM的关系知道某个房间在哪几个具体的IM上,直接向这几个IM交互
IM与房间的关系,IM与用户的关系,当我IM处于僵死状态下,服务不可用的时候,重启,需要清除这四种关系,也可以通过IM与用户的关系知道这个IM上有多少链接
用户连接上netty的IM,会产生一个channel,第一步用户初次建立链接需要携带token,IM收到这个消息,调用分发调度器,调度器再调用鉴权中心,判断token是否正确,如果正确,就绑定channel与该用户的关系,后需要的交互就不用再鉴权了,由于这一类的IM群聊多,并且一个用户只属于一个群,可以用netty的chanelGroup去管理用户的channel,
网友评论