先简单说一下技术方案吧:
用户登录之后与一台 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 又没有订阅者,那这部分信息该怎么处理?