最近在做一个 IM 的开发,初次尝试 IM 开发,碰到点问题向懂这块的兄弟们请教一下。直接上图:
用户登录之后与一台 server 建立连接,会话信息保存到本地( SessionMap ),就是把 userId 和 channel 的映射关系存起来,再把 userId 和 server 所在主机 MAC 地址的映射关系存到 redis 中。
每台 server 在启动的时候,会在 MQ 里订阅自己所在主机的 MAC 主题(这里是把主机 MAC 作为 MQ 的 Topic 用的)。
两个 user 之间相互发消息:
如果两个 user 在同一台主机,直接从本地 SessionMap 获取对方 channel 完成消息传递;
如果两个 user 在不同的主机,一个 user 发完消息后,server 端从 redis 中获取对方所在主机 MAC (假设为 MAC_2 ),然后把消息丢到 MQ 的 MAC_2 Topic 中,传递到对方主机,再从对方主机 SessionMap 中取出对方 channel ,完成消息传递;
如果是传给 MAC_3 上的 user ,user 不在线,就离线存储。
现在问题是,假如说某台机器故障了,比如假设 MAC_3 故障,硬件损坏,那 MQ 中 MAC_3 Topic 中的消息会越积越多,而这个 Topic 又没有订阅者,那这部分信息该怎么处理?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.