IM 中如何处理节点故障,导致消息不可靠问题?请教

查看 73|回复 3
作者:xhldtc   
最近在做一个 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 又没有订阅者,那这部分信息该怎么处理?

    user, 主机, Topic, Server

  • Nazz   
    做好容灾就行了
    billlee   
    应该用 userId 的 hash 来分区。哪有人用服务器的地址分区的。
    wyx119911   
    这架构很难维护,服务应该做成无状态的
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部