默认
发表评论 16
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
im系统中该怎么去设计连接的用户和channel(会话)的关联关系的?
阅读(52045) | 评论(16 收藏 淘帖1
im系统中该怎么去设计用户和channel的绑定关系?

可以快速的根据用户id检索到channel。根据channel检索到用户。

这个需要俩Map 来实现吗?


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

标签:IM开发
上一篇:即时通讯新手入门:一文读懂什么是Nginx?它能否实现IM的负载均衡?下一篇:[已解决] 求助MobileIMSDK退出账号后,重新登录会报203错误

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

推荐方案
评论 16
是的,可以用Map来实现一个用户channel引用集合,相当于在线用户列表了。MobileIMSDK就是这么做的,可以去看看源码。
引用:JackJiang 发表于 2019-07-02 16:26
是的,可以用Map来实现一个用户channel引用集合,相当于在线用户列表了。MobileIMSDK就是这么做的,可以去 ...

Map<userId, Channel > 可以根据用户id检索到channel。
如果我还需要根据 Channel 检索到用户的话。那只能用俩Map 映射关系了吗?
引用:KevinBlandy 发表于 2019-07-02 16:41
Map 可以根据用户id检索到channel。
如果我还需要根据 Channel 检索到用户的话。那只能用俩Map 映射关系 ...

那就用channel对象的hashcode再建立一个map。这有何难
引用:JackJiang 发表于 2019-07-02 20:04
那就用channel对象的hashcode再建立一个map。这有何难

难是不难。这个我也想到了。我只是觉得这样会不会太浪费内存了。
如果只建立一个Map映射关系。每次都去遍历,又浪费时间。
所以在这个空间和时间的抉择问题上,我想看看大佬们有什么好的解决方案没!
引用:KevinBlandy 发表于 2019-07-03 11:51
难是不难。这个我也想到了。我只是觉得这样会不会太浪费内存了。
如果只建立一个Map映射关系。每次都去 ...

内存肯定不浪费,key=hashcode,value=user_id,这能要多大的内存, 不信你可以自已模拟个一百万(不小了吧)key,看看要多少内存。

至于性能,哈希Map性能本身就很好(学过数据结构肯定都知道),而且程序内的缓存查找性能应该是其它任何方式都比不上的。这块,你完全可以看一下性能测试对比就能明白。同样是一百万的Key,你去看看性能数据。

实践才能出真知,空想没用的。
引用:KevinBlandy 发表于 2019-07-03 11:51
难是不难。这个我也想到了。我只是觉得这样会不会太浪费内存了。
如果只建立一个Map映射关系。每次都去 ...

不想这样的话,可以直接把用户绑定到channel中.
引用:JackJiang 发表于 2019-07-03 14:27
内存肯定不浪费,key=hashcode,value=user_id,这能要多大的内存, 不信你可以自已模拟个一百万(不小了 ...

这里是不是有两层映射关系,这个用户的连接到底在哪台机器上,然后是这个用户对应哪个连接?
第一个可以不可以用redis来做,第二个是内存的map?
引用:手写的从前 发表于 2020-05-21 18:45
这里是不是有两层映射关系,这个用户的连接到底在哪台机器上,然后是这个用户对应哪个连接?
第一个可以 ...

差不多是这样。
引用:JackJiang 发表于 2020-05-21 20:19
差不多是这样。

多谢老板
引用:JackJiang 发表于 2020-05-21 20:19
差不多是这样。

集群chanal怎么实现,比如A发消息给B,A在1号机器上,B在2号机器上
引用:差不多先生 发表于 2020-11-13 11:34
集群chanal怎么实现,比如A发消息给B,A在1号机器上,B在2号机器上

1号机器和2号机器间的通信,可以用RPC
引用:JackJiang 发表于 2020-11-13 11:42
1号机器和2号机器间的通信,可以用RPC

可以具体点吗,那是不是得先知道B的机器IP信息,然后可以通过http或者RPC请求方式?RPC具体的使用呢
引用:JackJiang 发表于 2020-11-13 11:42
1号机器和2号机器间的通信,可以用RPC

那得先维护每个用户的所在机器的IP信息?然后再通过http或者rpc转发?
引用:差不多先生 发表于 2020-11-13 15:00
那得先维护每个用户的所在机器的IP信息?然后再通过http或者rpc转发?

你去详细研究一下zookeeper
引用:JackJiang 发表于 2020-11-13 15:05
你去详细研究一下zookeeper

zookeeper可以做负载,我想问AB之间的通信,这块实现还在纠结,用http还是rpc,求demo
引用:KevinBlandy 发表于 2019-07-02 16:41
Map 可以根据用户id检索到channel。
如果我还需要根据 Channel 检索到用户的话。那只能用俩Map 映射关系 ...

大哥,一个用户可以对应多个长链接吧,例如pc、app、单片机等多个平台的长链接,这种应该怎么存储用户和channel的关系比较好,我想的是用Map<String, Set<Channel>> 保存是否合理?还有个问题想咨询下,同一个用户在同一个浏览器上面打开多个websocket标签页时,是不是一个用户会对应多个websocket长链接?
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部