默认
发表评论 11
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
引用:aihe521 发表于 2022-08-30 23:12
Java存储几十几百G应该靠的是集群吧;

如果Session存在单机上,发送C2C消息的时候,首先用Redis获取到 ...

我这里有一个方案,使用Bitmap数据结构保存用户的在线状态,读取状态时间复杂度为o(1),空间复杂度一个用户占用1个bit位,也就是说在占用极低的内存的情况下又可以得到一个o(1)的时间复杂度,真是鱼和熊掌兼得。在这样的一个数据结构的加持下,立马可以为当前消息应该路由到哪一台IM服务器上提供了一个方案,IM集群的最大问题就解决了。我画个图(宿舍电脑没有visio,就用手画了)。 服务端的Session可以存放在Redis中实现集群吗?_7_)48C[2C)I6IZX9F61Y`U8.jpg
性能瓶颈:在判断用户在哪台服务器上时,需要遍历服务器来判断用户到底在哪台服务器上,这个操作会带来一个o(n)的时间复杂度,但这个Reactor的网络模型单机并发量很高,也就意味着n不会很大,我认为这个时间复杂度是完全可以接受的。

以上纯纯本人拙见,希望能帮到你。
评论 11
引用:JackJiang 发表于 2022-09-09 10:30
"在判断用户在哪台服务器上时,需要遍历服务器来判断用户到底在哪台服务器上":没明白,为什么要遍历?

假设有n台服务器,判断用户在哪台机器上就是下面这个伪代码的逻辑
for(IMServer server:servers){
       if(online(userid,server)){
            //用户在这台服务器上,转发消息
           return;
       }
} //用户不在线



引用:JackJiang 发表于 2022-09-09 19:53
搞个集中式的key=userid,value=serverid,这样的列表管理在线用户

这又是空间换时间了
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部