netty 多用户如何缓存的问题

天王盖地虎626 发布于 2015/01/02 13:57
阅读 3K+
收藏 2

每当netty客户端连上服务端后,我都把用户id,channel做一个对应关系后,然后存放到
Map<String,Channel>,比方说,用户001,002分别连上netty服务端后,分别建立2个信道channel1,channel2,然后存放到Map<String,Channel>中,将来如果001用户要推送信息到002用户,就可以到Map<String,Channel>中找到002,然后把信息推送到002所绑定的channel2中,但是,如果在线用户有70万左右后,把这些用户都放在内存中的map中,肯定不合适的,请问你们是怎么缓存这些信息的?

如果你们不是用我的思路进行推送的,请问你们是如何做的?

加载中
1
book
book

从你的描述看,大概是采用推的模式,即A用户发消息给B用户,由服务器收到消息后,主动推给B用户。如果是这个场景,建议将服务写成无状态的,不保存用户和通道关系,举个例子,每个用户有一个对应的消息队列(redis list),如果A发消息给B,由服务端直接将消息写入到B的list中(rpush),然后可以通过心跳机制,当B发心跳到服务器,服务器检查B队列有没有消息(lpop),如果有,做为心跳返回将消息发给B,这样做模式非常简单,而且利用心跳机制,不算浪费资源,但也有个弊端,就是要保证消息及时,心跳频率会很高,如果1秒可接受的话,觉得这种方式比较靠谱。

划船全_靠浪
心跳频率没变吧? 只是消息的即时度有所延迟?楼主这个问题我也想知道答案,目前我们做法就是放内存,在云服务器 随时可以扩展。 楼主这个如果是发送消息的话是不是可以考虑用推送消息的模式,或者服务器只做协助客户端之间打通点对点的通讯?
金贞花
金贞花
这种的 也算 巧妙的 利用了 心跳了,但是 心跳多了呢,你想想
0
红薯
红薯
那么多在线,一台服务器顶不住吧
0
名字是什么能吃吗
名字是什么能吃吗
这种东西不可能这么做的 我估计服务端开放的地址只是转发的功能 根据你的信息转发到相应服务器 每个服务负载一小部分玩家
0
天王盖地虎626
天王盖地虎626

引用来自“红薯”的评论

那么多在线,一台服务器顶不住吧
初步netty服务端做负载平衡,把客户端连上服务端的用户和channel写到缓存中,这个缓存打算用Redis来缓存用户和channel,这个缓存服务器估计也要多台,我现在想知道,我这样的思路能不能行的通,如果不行,请问大家用什么办法呢?给个思路即可。
0
天王盖地虎626
天王盖地虎626

引用来自“吐哈分享”的评论

写库吧
写库,肯定更加不靠谱
0
天王盖地虎626
天王盖地虎626

引用来自“名字是什么能吃吗”的评论

这种东西不可能这么做的 我估计服务端开放的地址只是转发的功能 根据你的信息转发到相应服务器 每个服务负载一小部分玩家
我只是描述我的思路,具体做法,是服务器那边做负载均衡,任何一个服务器接受到客户端的连接后,其用户信息,channel存储到缓存中,我现在担心缓存应该用什么来做?缓存对象好不好弄?
采蘑菇的大叔
采蘑菇的大叔
这个问题最终是怎么弄的?
0
明月照大江
明月照大江

要看单用户的内存数据是多少。

如果就是一个channel,一个对象占用的内存也就2-3KB(取3KB),* 70W =2100000KB=2G。

完全装得下嘛。

明月照大江
明月照大江
回复 @mcloud : 换算啊
mcloud
mcloud
为什么=2G
0
火亮
火亮

引用来自“名字是什么能吃吗”的评论

这种东西不可能这么做的 我估计服务端开放的地址只是转发的功能 根据你的信息转发到相应服务器 每个服务负载一小部分玩家

引用来自“天王盖地虎626”的评论

我只是描述我的思路,具体做法,是服务器那边做负载均衡,任何一个服务器接受到客户端的连接后,其用户信息,channel存储到缓存中,我现在担心缓存应该用什么来做?缓存对象好不好弄?
使用缓存要注意了,LRU策略可能导致连接断开
0
oufu
oufu

channel 怎么存到redis 中啊。。 不能序列化

返回顶部
顶部