网易首页 > 网易号 > 正文 申请入驻

WebSocket 100万到1000万

0
分享至


256条消息的缓冲,在10万用户时是保险栓,在100万用户时变成绞索。某体育直播平台的工程师团队用一场OOM屠杀学到了这个教训——他们的节点在决赛夜像僵尸一样被Linux逐个爆头。

这不是内存泄漏,是设计层面的"慢性溺水"。

系统架构白纸黑字写着标准答案:消息中心(Hub)把比分推给每个WebSocket客户端,一个带缓冲的channel防止主循环阻塞。Go语言的并发模型让这段代码看起来无懈可击。

100万用户同时在线时,"无懈可击"变成了每小时数GB的内存黑洞。

第一刀:缓冲区的复利陷阱

团队给每个客户端分配了256条消息的send channel。数学很简单:256 × 单条消息大小 × 用户量。但他们漏算了一个变量——N不是常数,是毒。

用户不会均匀消费。有人用5G看直播,有人在地铁里用3G。后者的Write()操作可能阻塞数秒,而上游的Hub还在拼命往channel里塞消息。

缓冲区的初衷是"吸收瞬时波动",实际是"为慢消费者提供无限赊账"。当10%的用户变成慢节点,系统要额外承担25.6万条消息的内存驻留——这还没算Go运行时的channel开销。


更隐蔽的是垃圾回收(GC)的报复。这些积压的消息跨越了多个GC周期,从年轻代晋升到老年代,最终把堆内存撑到触发OOM killer的阈值。节点不是"崩溃",是被操作系统合法处决。

第二刀:Write()的同步幻觉

代码里藏着一个危险假设:c.conn.NextWriter()和w.Write()是"快速操作"。网络编程的初级课本会告诉你这是错的,但面试白板上的架构图不会提醒你。

WebSocket的Write在TCP层是异步的,在应用层是同步阻塞的。当对端接收窗口归零,Write会挂起直到超时或恢复。这个"直到"在代码里看不见,在监控里表现为CPU.idle和内存.usage的诡异背离。

团队最初的排查方向是JSON序列化。他们加池子、换协议、压测CPU,全错。真正的瓶颈在几百行代码之外,在一个他们"假设很快"的函数调用里。

CPU利用率不到30%,内存却像漏水的船——这是典型的IO阻塞型饥饿。

第三刀:背压机制的集体失忆

流处理系统的第一课叫backpressure(背压):当消费者跟不上,要向上游反馈,而不是无限缓冲。这个平台的Hub没有这门课。


消息生产端(比分数据源)和消费端(用户浏览器)之间隔着一层"假装一切正常"的channel。Hub的select语句非阻塞发送,满了就丢?不,他们的实现是阻塞发送——于是整个广播循环被单个慢用户拖垮。

没有背压的广播系统,本质上是在用内存买时间。买的时间不是给用户追赶进度,是给工程师逃避"该踢掉谁"这个决策。

决赛夜的800k用户峰值把这张信用卡刷爆了。

止血方案:从"缓冲一切"到"感知一切"

团队的重构没有炫技。他们把256条固定缓冲改成动态水位监测,Write()超时从"无限"改成500ms,超时就关闭连接——慢用户被踢,但系统活下来。

更关键的改动在Hub层:引入有界广播。每个消息携带序列号,客户端ACK确认。丢包就丢包,用户端会请求重传特定区间。这相当于把TCP的可靠性机制在应用层重做一遍,但控制权握在自己手里。

Go的channel被保留,但用途变了:从"缓冲池"变成"信号量"。满channel不再堆积消息,而是触发流控,让上游降速或采样。

新架构上线后的压力测试显示,同等硬件下内存占用稳定在峰值15%,GC暂停从秒级降到毫秒级。代价是3G用户偶尔会看到"连接断开,正在重连"——这比看到白屏强。

「我们以为在优化代码,其实是在偿还设计债。」团队在后记里写道。那个256的魔数来自早期原型测试,当时100个并发用户跑得很顺,就再也没动过。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
湖南百米白灯笼不是炫丧,也不是传统,官方介入,真相浮出水面

湖南百米白灯笼不是炫丧,也不是传统,官方介入,真相浮出水面

社会日日鲜
2026-04-12 13:26:16
伊美第三轮会谈在伊斯兰堡举行

伊美第三轮会谈在伊斯兰堡举行

新华社
2026-04-12 04:15:03
新华社快讯:伊朗代表团离开巴基斯坦

新华社快讯:伊朗代表团离开巴基斯坦

新华社
2026-04-12 11:55:14
停火签了也白搭!85名议员联手逼宫,要罢免特朗普,警告绝不姑息

停火签了也白搭!85名议员联手逼宫,要罢免特朗普,警告绝不姑息

说历史的老牢
2026-04-11 15:10:50
这是青年时期毛岸青,这张照片眉眼神态极像母亲杨开慧

这是青年时期毛岸青,这张照片眉眼神态极像母亲杨开慧

乡野小珥
2026-04-11 18:37:43
吃他汀不能碰燕麦?医生劝告:不只是燕麦,这3物再馋也要忌嘴

吃他汀不能碰燕麦?医生劝告:不只是燕麦,这3物再馋也要忌嘴

坠入二次元的海洋
2026-04-12 14:37:42
你最接近生理极限的一次经历是什么?网友分享让人目瞪口呆!

你最接近生理极限的一次经历是什么?网友分享让人目瞪口呆!

夜深爱杂谈
2026-04-09 19:39:13
湖北政务大厅80%为劳务外包用工 工资2000多 为何不全部采用正式工

湖北政务大厅80%为劳务外包用工 工资2000多 为何不全部采用正式工

椰青美食分享
2026-04-12 14:56:20
爆单!问界M6预售不到20天预订破10万台

爆单!问界M6预售不到20天预订破10万台

快科技
2026-04-11 18:08:11
在刚刚,上午16家公司出现重大利好消息,看看有没有与你相关的个股

在刚刚,上午16家公司出现重大利好消息,看看有没有与你相关的个股

股市皆大事
2026-04-12 11:20:15
美舰闯霍尔木兹海峡挑衅地区和平

美舰闯霍尔木兹海峡挑衅地区和平

烽火瞭望者
2026-04-12 14:20:04
网传282人群22位业内人士名单:8个现役选手 还有4记者3裁判2教练

网传282人群22位业内人士名单:8个现役选手 还有4记者3裁判2教练

风过乡
2026-04-12 11:26:44
万斯:美国或考虑对伊朗使用“核武器”!

万斯:美国或考虑对伊朗使用“核武器”!

达文西看世界
2026-04-10 14:36:52
郑丽文的婚姻:女主外男主内,不生育孩子,事业理想置于家庭之上

郑丽文的婚姻:女主外男主内,不生育孩子,事业理想置于家庭之上

观察者海风
2026-04-09 17:42:58
盐水洗蓝莓等于吃虫卵!老果农教一招,虫子跑光营养全保

盐水洗蓝莓等于吃虫卵!老果农教一招,虫子跑光营养全保

开心美食白科
2026-04-09 09:44:59
继火烈鸟后乌克兰再推出“和平鸽”导弹!摧毁俄海上基地

继火烈鸟后乌克兰再推出“和平鸽”导弹!摧毁俄海上基地

项鹏飞
2026-04-11 22:57:39
民进党当局将引进印度劳工,王鸿薇公开反对:岛内民众高度焦虑

民进党当局将引进印度劳工,王鸿薇公开反对:岛内民众高度焦虑

海峡导报社
2026-04-11 16:36:03
注意:这8样东西不能用酒精擦,一擦就坏,无法修复

注意:这8样东西不能用酒精擦,一擦就坏,无法修复

室内设计师有料儿
2026-04-12 13:00:36
曾志伟追债20多年终获胜!讨回5700万,还债人居然是她,令人意外

曾志伟追债20多年终获胜!讨回5700万,还债人居然是她,令人意外

一盅情怀
2026-04-11 17:12:15
两岸谈完,郑丽文临走前达成共识,岛内传出两种截然不同的声音

两岸谈完,郑丽文临走前达成共识,岛内传出两种截然不同的声音

爱看剧的阿峰
2026-04-11 18:55:26
2026-04-12 17:31:00
码上闲叙
码上闲叙
有态度网友ytd
1664文章数 22关注度
往期回顾 全部

科技要闻

理想称遭恶意拉踩,东风日产:尊重同行

头条要闻

媒体:长谈未果万斯离开前竖拇指 特朗普挤出僵硬笑容

头条要闻

媒体:长谈未果万斯离开前竖拇指 特朗普挤出僵硬笑容

体育要闻

五大联赛首冠出炉?拜仁或提前4轮卫冕德甲

娱乐要闻

46岁赵达官宣结婚!曾与殷桃谈婚论嫁

财经要闻

三轮磋商谈至深夜 美伊谈判三大议题仍待解

汽车要闻

焕新极氪007/007GT上市 限时19.39万起

态度原创

时尚
游戏
教育
数码
手机

伊姐周六热推:电视剧《八千里路云和月》;综艺《乘风2026》......

暴雪完胜!全球最大魔兽怀旧私服被判永久关停

教育要闻

Q开头的单词!

数码要闻

何刚暗示华为WATCH FIT 5 Pro智能手表即将发布

手机要闻

苹果赢麻了!iPhone 17国内销量突破2721万台:Pro Max成最大功臣

无障碍浏览 进入关怀版