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

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

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

12550 次点击
所在节点    Java
92 条回复
zjsxwc
2020-02-26 12:40:51 +08:00
1 万连接,java 没有问题的
realpg
2020-02-26 12:57:04 +08:00
@lasuar #41
你没见过不代表不存在且不合理
我这就有跟楼主一样的 只是 TCP

一个服务用几千个 TCP 频道实时广播信息
一般一个客户只需要订阅一个频道

但是因为性能问题,自建的地区中继,就得所有频道信息 relay
就是一组服务器几千个客户端
zfish
2020-02-26 12:58:39 +08:00
使用 elixir/erlang 开发吧,上万并发不要太轻松
lasuar
2020-02-26 13:01:55 +08:00
对于 ws 服务端来说,一台普通服务器倒不是说承受上 w 个 client 连接无压力,这个还要看消息 size 和传输频率,几十万人直播间那种一台机器的网卡都受不住了。
sampeng
2020-02-26 13:06:11 +08:00
先搞清楚 ws 和 tcp 的关系…另外有一句说一句。你确定对方能支持上万的 qps ?
gamexg
2020-02-26 13:16:16 +08:00
上万个没难度啊
网关类单服务器连入几十万连接,连接空闲时 120m 一个 ping,外加数据传输网卡跑到 500M+,毫无问题。
gamexg
2020-02-26 13:17:18 +08:00
@gamexg #66 120m->120s
lasuar
2020-02-26 13:27:34 +08:00
@realpg 好吧,只能说确实太少见了,这得是多大的项目规模了
x66
2020-02-26 13:37:10 +08:00
这是要爬直播平台的弹幕和礼物吧
paoqi2048
2020-02-26 13:42:30 +08:00
Drinker
2020-02-26 13:54:55 +08:00
@tinybaby365 好呢,我们这边考虑一下,谢谢。
@maichael 好的,找个时间测试一波看看。
@no1xsyzy 多谢提醒,我这边已经被禁止回复好几次啦,哈哈
@zfish 多谢建议,我们去了解一下。
@lasuar 嗯,我们先测试一下看看,谢谢。
@sampeng 对方可以搞,实时的几万个频道的广播,现在就是不知道对方怎么弄的,/(ㄒoㄒ)/~~
@gamexg 好呢,我们测试一下,谢谢
@x66 不是,类似这种消息中转和消息概要记录。
@paoqi2048 谢谢,我们了解一下。
tairan2006
2020-02-26 13:59:14 +08:00
上万个没啥难度啊…你可以用 mqtt broker,开源的都能单机上万了
pinews
2020-02-26 14:23:37 +08:00
小白请教一下
这个 api 对应的参数有个上万个,每个参数对应一个 websocket !每个参数对应的难道不应该是一个频道吗?
zfish
2020-02-26 14:38:00 +08:00
@Drinker elixir 单机 4GB 开百万进程( Erlang 的虚拟进程,实际上底层是 Erlang 实现了自己的 CPU 调度算法,并不依赖操作系统的调度,所以可以做到极其低成本的开销去切换进程),每个进程都是独立的内存分配,百万用户的长链接都可以用百万的进程去独立负责通信,所以 Erlang 在游戏领域后台 /电信领域使用的很多,不过 Erlang 的语法有点奇怪,可以用基于 Erlang 的 Elixir 去开发
zfish
2020-02-26 14:50:10 +08:00
@zfish ![]( https://img.bmpi.dev/c5a8569f-42b1-63de-15a5-25d77f29a050.png) Elixir 的 Web 框架 Phoenix 单机两百万 WS 长链接,毫无压力
noisywolf
2020-02-26 15:27:06 +08:00
1、用 nginx+lua,就是 OpenResty,每个连接挂个 redis 的 pubsub
2、用 go,轻松解决
SjwNo1
2020-02-26 15:36:01 +08:00
gogogo
lfcyme
2020-02-26 15:52:25 +08:00
建议换 elixir + phoenix channel, 特别香 ( 逃 ~
lfcyme
2020-02-26 15:52:49 +08:00
@zfish #75 elixir 握爪
zjq123
2020-02-26 16:07:52 +08:00
@zfish 我觉得主要是 socket 肯定涉及到内核 只不过 erl 在伪进程调度方面实现了自己一套 不涉及到操作系统进城管理了 而只涉及到内核 socket 部分

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

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

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

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

© 2021 V2EX