我的业务场景:
在线聊天室,因为需要保持长连接,所以一个聊天室ChatRoom里面包含了最多200个Socket。
而在线聊天室最多情况10w个,然后这10w个ChatRoom都放到map中。
即:
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吧,又不是客户端socket,怎么会有2000w个怎么多?
------解决方案--------------------
这有点牛叉。
计算下一个ChatRoom的所占字节数,比如各个字段的大小,一个chatroom出来了,总的就出来了。
------解决方案--------------------
如果你用传统IO,一台服务区可能勉强能够支持一两千个socket差不多,用NIO,程序优化的好的话,可能能够支持几千到万把个。
当然这只是粗略估算,具体的你要实测一下。
具体消耗多少内存,直接用工具实测是比较准确的。
------解决方案--------------------
说的很详细,如果没有集群,千万的级别量,你想都别想。现在随便找一个网站,基本上都有集群
------解决方案--------------------
内存占用多少与每个Socket占用的缓冲区大小相关,如果是单纯的Socket可以自己指定缓冲区大小,你说的websocket组件不知道有没有这功能。知道了缓冲区大小,你就可以自己计算内存占用了,比如2000W*8KB=160GB。
为了减少Socket数量,你可以让每个客户端公用一个Socket。
有足够的内存保持长连接,不代表你的一台服务器能处理多少连接。比如你的服务器只能处理5W次/s交互,而你实际需求可能有10W次/s,那么肯定是不行的。