默认
发表评论 5
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
IM 如何确定用户所在接入模块,正确推送消息?
阅读(38700) | 评论(5 收藏1 淘帖1
分布式部署多个接入模块,当后面业务模块要给一个用户推送消息时,如何知道这个用户现在所在接入模块?
现在想到的方法有两个:
1 使用一致性哈希算法 ,根据用户id让用户连接到固定的接入模块,后面模块推送消息时也根据hash计算接入模块,正常情况和接入模块挂了没影响,但是如果挂了的接入模块重启或者新加接入模块,后面模块计算的时候会发给新接入模块,但是用户实际还在另一个接入模块,就有问题了,用户收不到消息了 只能等重新连接了
2 用户连接后把用户和所在接入模块存到缓存服务内,后面给用户推送消息时查一下缓存,然后推送到接入模块,这样写入访问会太频繁了

不知道目前像微信这种主流的im 这块是怎么设计的? 目前没有头绪,请大家多多指教

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:即时通讯安全篇(八):如果这样来理解HTTPS,一篇就够了下一篇:求助关于IM中离线消息拉取时本地存储的msgID疑问

本帖已收录至以下技术专辑

推荐方案
评论 5
是的,你考虑的没错。

第一种办法有明显的缺陷。

第二种办法是比较容易想的到的,也确实存在你考虑的这个访问频繁问题。不过,要优化这个问题,可以把思路放的开阔一点,可以学习DNS的原理,比如一次查询后,在下次访问的时候,一段时间内(比如1分钟、10分钟等)不需要再次查询,因为客户端不太可能连接跳变的这么厉害,即使存在跳变,在客户端也可以优化为:某段时间内优先连接登陆时的这台服务器等等。  诸如此类的优化,你想想是不是就可以达到一定的优化目的。

当然,谁也不是神仙,完美的方案是不是存在的,只是说自已能不能hold住,能不能根据自已的需求优化到极致。
引用:JackJiang 发表于 2018-09-04 19:40
是的,你考虑的没错。

第一种办法有明显的缺陷。

嗯嗯, 这些也是我没想到的,很好的思路,我再想想,这个缺点就是消息的实时性没法保证
引用:刘杨 发表于 2018-09-05 09:59
嗯嗯, 这些也是我没想到的,很好的思路,我再想想,这个缺点就是消息的实时性没法保证

所谓的实时性,对于IM来说其实还好,你在测试的时候是左手一个手机右手一个手机,延迟多少你是知道的。

但真实聊天时,比如你跟你的女神聊,女神到底是1秒后回复的、还是1分钟后回复的,其实影响不大,因为如果是1分钟后回复的话,她是不是去小了个便,或者喝了口水,你也不知道。是否真的是消息延迟导致的,那有什么关系呢,反正你又不知道。 主要是别丢消息就行了。不信,你体会一下
第二个方案。如果缓存架构设计的不好的话。最终很容易成为单点瓶颈
签名: 秋天到了,终于凉快了
我们是这样做的,使用第二种方案,一段时间内查询一次,如果推到接入模块,发现不对,接入模块反推一个报告给路由模块,重新查询一次
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部