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

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

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

12513 次点击
所在节点    Java
92 条回复
lasuar
2020-02-26 11:29:51 +08:00
哪有正常的逻辑是一方使用上 W 个端口去连接 ws 的,我建议楼主把逻辑理清楚说清楚,无厘头。。。
Xusually
2020-02-26 11:33:05 +08:00
需要长链接吗?
怎么感觉你这场景是股票行情信息同步推送?
Drinker
2020-02-26 11:35:26 +08:00
@ryd994 哈哈,我去搜了一下,这个的确和 C10K 的场景差不多。
Drinker
2020-02-26 11:38:52 +08:00
@sagaxu 相当于 ws 连接前缀相同,加了参数就是一个 ws 连接,现在参数的变化有一万多种,所以就有一万多连接。
Drinker
2020-02-26 11:39:41 +08:00
@ftfunjth 嗯,我们这边考虑一下。谢谢。
Drinker
2020-02-26 11:47:50 +08:00
@wizardoz 主要就是通过 WebSocketClient 来连接,不过没找到 onMessage 是异步 IO 还是多线程,搜了一下,好像都没提到。现在暂时的想法是 onMessage 有信息的时候立马推到 jms 里面,另外一台服务从队列里面一个个取出数据保存起来。
Drinker
2020-02-26 11:48:22 +08:00
@gemini767 嗯,这边考虑一下,谢谢。
Drinker
2020-02-26 11:50:02 +08:00
@liqingcan 有点类型直播的这种,比如虎牙直播,每个直播间的信息其实是一个 ws 连接,现在我知道一万个房间号,我就可以连接一万个房间的直播信息,然后把直播信息保存下来。类似这种。
Drinker
2020-02-26 11:50:54 +08:00
@realpg 哈哈,都在考虑方案当中。
fancy111
2020-02-26 11:51:19 +08:00
上万个 WS 是肯定没问题的,问题是带宽会爆
Drinker
2020-02-26 11:51:34 +08:00
@pubby 有点类型直播的这种,比如虎牙直播,每个直播间的信息其实是一个 ws 连接,现在我知道一万个房间号,我就可以连接一万个房间的直播信息,然后把直播信息保存下来。类似这种。
Drinker
2020-02-26 11:52:32 +08:00
@lasuar 有点类型直播的这种,比如虎牙直播,每个直播间的信息其实是一个 ws 连接,现在我知道一万个房间号,我就可以连接一万个房间的直播信息,然后把直播信息保存下来。类似这种。
Drinker
2020-02-26 11:53:55 +08:00
@Xusually 对呢。很类似。不能断,断了数据就没了。启动就需要很多连接。对方提供的只是 ws。
lasuar
2020-02-26 12:01:23 +08:00
@Drinker 直播的 N 个 ws 连接是存在于服务端,只会占用服务端一个 ws 服务端口,程序存储的 N 个 conn 对象都是占用的同一个的端口,你这个场景就类似于拿一台机器模拟上 W 个 ws 客户端,所以才需要上 W 个端口,不要搞混了。
CodeCore
2020-02-26 12:12:20 +08:00
tinybaby365
2020-02-26 12:16:05 +08:00
之前用 golang 实现过,单机用了 24GB 的内存,大概 160w 个连接。诀窍是省内存,降低你服务的每个连接的内存消耗,我没用 net/http,虽然我用的 websocket 库是依赖 net/http,但 go 的鸭子类型可以让我用一个简陋消耗更小的 conn 替代。
另一个就是降低系统 socket 的读写 buffer。root 权限加 rlimit 设置,突破单进程的限制。
maichael
2020-02-26 12:22:39 +08:00
我记得之前看过测试,一台还可以的机器撑 100 万左右的 Websocket 没问题。
aguesuka
2020-02-26 12:34:59 +08:00
理论上 nio10k 个 tcp 连接没有问题,用 netty 试试呗。我估计系统瓶颈 io,cpu,然后才是内存
no1xsyzy
2020-02-26 12:37:35 +08:00
@Drinker 附加信息不要一个个回复,可以 append,可以 @ 多个人。不然你容易被降权导致别人根本收不到你的消息。
no1xsyzy
2020-02-26 12:39:35 +08:00
@lasuar #41 可是楼主也没提到端口啊,是上面有人(#5、#30 )觉得一个链接一个端口,而且已经被人反驳了。

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

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

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

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

© 2021 V2EX