一个 Java 项目如果需要启用上万个 websocket,有什么好办法么

2020-02-26 10:16:52 +08:00
 Drinker

大概是这样,对方有个 api,这个 api 对应的参数有个上万个,每个参数对应一个 websocket,现在要做的是拿到参数,每个参数启动一个 websocket 去保存发送下来的数据,保存现在使用消息队列应该没什么问题,就是如果启动了上万个 websocket 会不会内存直接爆炸?或者还是有没有其他的办法,老哥们。

12484 次点击
所在节点    Java
92 条回复
Drinker
2020-02-26 10:43:20 +08:00
@GM 数据具有实时性,很大概率需要全部 websocket 开着,不能关闭,关闭了数据就没了。
liuguang
2020-02-26 10:48:40 +08:00
这种事情 go 和 rust 应该可以做到。至于 java,用 nginx 反代分流,每台 Java 服务器处理一部分 ws 流量,应该也可以搞定.
casillasyi
2020-02-26 10:51:53 +08:00
jvm 本身就是个负担。这种场景建议用 rust
polythene
2020-02-26 10:56:37 +08:00
做 sharding 吧,单机器估计扛不住
sagaxu
2020-02-26 10:56:51 +08:00
参数不能作为 message 的一部分吗?
zzcworld
2020-02-26 10:57:37 +08:00
建议拆成 worker,每个 worker 连接几千个 websockets。如果能订阅多个 channel,减少 websockets 连接,也是一个好办法
sagaxu
2020-02-26 11:03:01 +08:00
@polythene 2 代树莓派开 2 万个 websocket 毫无压力,比树莓派性能还差的服务器?
@liuguang Java 正常服务器单机 100K 个 websocket 应该问题不大
ftfunjth
2020-02-26 11:04:44 +08:00
对参数 hash 然后想办法分布式多台服务器。数据落地可以想办法被动写回或者主动扔到 redis 然后再定时持久化。
wizardoz
2020-02-26 11:04:50 +08:00
内存会不会爆炸取决于你的内存有多少,而且直觉上这个内存消耗不大。
我觉得最应该考虑的问题是多线程方式处理每个连接还是通过异步 IO 的方式处理。如果异步 IO,我相信对服务器的要求不高。
如果是多线程,那么服务器就难了。
XRR
2020-02-26 11:05:53 +08:00
@sagaxu 100000 个 websocket 都超过服务器的端口数了,肯定不行,服务器一共就六万多个逻辑端口
gemini767
2020-02-26 11:09:39 +08:00
团队没有专业人员建议 http 轮训,简单有效,最重要的可控
liqingcan
2020-02-26 11:11:51 +08:00
什么需求需要这么多 websocket im 类的需求?这玩意也不会用一台机器吧。挺好奇的
lscho
2020-02-26 11:13:47 +08:00
@XRR 想啥呢。。。websocket 和端口有什么关系,又不是 TCP。

实践出真知,几万个 websocket 连接数肯定是没啥问题的,几十万也没问题,需要考虑的就是数据量问题,数据量过大同时进来肯定不行。
gemini767
2020-02-26 11:14:24 +08:00
@sagaxu 开 2w 个 socket 和支持 2w 个长链接业务还是有很大差别的吧
realpg
2020-02-26 11:16:31 +08:00
你们老板需要一个架构师。。。
pubby
2020-02-26 11:17:39 +08:00
会不会理解有偏差,上万个参数其实可以一起传的?
ftfunjth
2020-02-26 11:19:33 +08:00
@lscho 我记得 spring websocket 默认是一个连接一个 socket 用的是异步套接字。如果是 epoll,两万个 websocket,cpu 包处理速度够的话应该没问题。怕 socket 的 receive buffer 过大。导致内核内存缓冲区不够用。如果内核内存满了的话一直在用虚拟内存怕是电脑会卡死?
realpg
2020-02-26 11:20:15 +08:00
我这里有个类似的东西。
也是客户端 开 4400 个 TCP 连接到远程,然后保存下推流,解码,入库。
用了 12 台垃圾 1U 服务器,服务器总成本一万五千元……
realpg
2020-02-26 11:21:49 +08:00
@pubby #36
你没理解他的业务模型。
lasuar
2020-02-26 11:28:46 +08:00
你这个场景有点像是对 ws 服务端做鲁棒性测试

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/647612

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX