Map<ChatRoom> chatrooms = new HashMap<ChatRoom>(); chatrooms.put(chatroomId,chatroom);// put 10w个,每个chatroom都存有200个socket,都存在内存中。
10万*200 = 2000万个Socket 别说64GB,64TB内存估计都不够用 再说一台机器可用的端口数有限,一般不超过65536个,你这根本创建不了那么多Socket。。 另外2000万个Socket这种规模,你想用一台服务器搞定,开什么玩笑?就算内存够用,CPU,磁盘IO,网络IO承受得了2000万个Socket?你当那是超算?超算都不带这样玩的。。 这种规模都是大型集群服务,而且为了速度,一般还设有很多分布式节点服务器为不同地区的用户导流,通常都有几百甚至上千台各类服务器协同工作 最后提醒你一下你确定这是实在的需求,而不是你的美好展望? 10万个房间,每个房间能容纳200人,也就是理论同时在线可达千万人,这种规模的聊天室,全世界都数得出来有哪些吧
感谢建议,我会去了解下。 但是客户端怎么公用一个socket呢?每一个用户加入聊谈室都要新建一个socket与服务器连接。能否详细说说?
如果你用传统IO,一台服务区可能勉强能够支持一两千个socket差不多,用NIO,程序优化的好的话,可能能够支持几千到万把个。 当然这只是粗略估算,具体的你要实测一下。 具体消耗多少内存,直接用工具实测是比较准确的。
[quote=引用 2 楼 vnvlyp 的回复:] 10万*200 = 2000万个Socket 别说64GB,64TB内存估计都不够用 再说一台机器可用的端口数有限,一般不超过65536个,你这根本创建不了那么多Socket。。 另外2000万个Socket这种规模,你想用一台服务器搞定,开什么玩笑?就算内存够用,CPU,磁盘IO,网络IO承受得了2000万个Socket?你当那是超算?超算都不带这样玩的。。 这种规模都是大型集群服务,而且为了速度,一般还设有很多分布式节点服务器为不同地区的用户导流,通常都有几百甚至上千台各类服务器协同工作 最后提醒你一下你确定这是实在的需求,而不是你的美好展望? 10万个房间,每个房间能容纳200人,也就是理论同时在线可达千万人,这种规模的聊天室,全世界都数得出来有哪些吧
内存占用多少与每个Socket占用的缓冲区大小相关,如果是单纯的Socket可以自己指定缓冲区大小,你说的websocket组件不知道有没有这功能。知道了缓冲区大小,你就可以自己计算内存占用了,比如2000W*8KB=160GB。 为了减少Socket数量,你可以让每个客户端公用一个Socket。 有足够的内存保持长连接,不代表你的一台服务器能处理多少连接。比如你的服务器只能处理5W次/s交互,而你实际需求可能有10W次/s,那么肯定是不行的。
62,614
社区成员
307,327
社区内容
加载中
试试用AI创作助手写篇文章吧