刚刚 B站又血崩了?!我来告诉你真正原因
B 站又双叒叕崩了,这次是真炸裂了!6 月 12 日晚 9 点左右,我还在直播呢,突然就看到弹幕都在说 B 站炸了,我立马坐不住了,光速下波,作为一名前大厂程序员,就爱吃大厂的瓜,就爱吃同行的瓜,吃瓜就要在最前线!作为一名技术人员,下面带大家一起吃瓜,也说说我对这个事故的理解。
老规矩,优先推荐看视频版~ https://bilibili.com/video/BV1eDMwzvEy1(服了,被卡了很久审核)
事故情况
这次的事故可不是小打小闹,时间长、异常多、影响面大,关键是还上了各平台的热搜。

从晚上 5 点多开始出现异常,直到 9 - 10 点才陆续恢复,整整折腾了 快 4 个小时!
你是不是也怀疑自己断网了?
这次的事故现场惨不忍睹啊:
1)主页报错,要么是打不开,要么推荐一些莫名其妙不感兴趣的内容,有朋友反映主页突然出现一堆小姐姐(笑死,正常情况下我也是这样的)

2)视频无法播放,加载失败

3)评论区无法加载、显示"服务暂不可用"

4)博主的个人主页打不开,UP 主们都慌了

5)我的直播虽然没有中断,但是弹幕时不时就会丢失,观众都跑完了!
6)系统卡了很多次,有网速但是就是进不去

7)最关键的是,有些页面直接出现了 504 错误!

真的可以说是 全链路崩盘 了!
小道消息
据内部人员小道消息称,这次事故是受到公司基建 discovery 故障影响,约有 10% 左右的请求失败;基础架构炸了,在疯狂抢修。。。
个人分析
虽然不是内部人员,但是从专业技术人员的角度,也说说我对这次事故的分析和看法。
首先,这次的事故算是血崩,高低是个 P0 级事故。对于 B 站这样的大型系统,背后起码有成千上万个服务器对吧?肯定用了微服务架构,把大系统拆分成不同的服务,有的服务专门负责播放视频,有的专门处理评论,有的跑推荐算法。能够同时影响到这些服务的,到底是何方神圣呢?
没错,就是 Service Discovery 服务发现系统,听起来很高大上,但其实很好理解。
它就像是一个存储了海量地址信息的导航系统,当用户执行了 B 站的某个操作,比如点击一个视频的时候,其实是向网关服务器发了一个请求,然后网关它要知道把这个请求交给哪个服务器去处理,就需要找到 Discovery 导航系统,获取到服务器的地址信息,然后就可以把请求转发给这台服务器去处理了。
那为什么 Discovery 一崩,整个 B 站就跟着崩了呢?这就是微服务架构的一个特点 —— 高度依赖服务发现。打个比方,如果 B 站是一个超大型商场,Discovery 就是商场里的导购台和所有的指示牌系统。
想象一下,如果商场里所有的指示牌突然全部黑屏了,导购台的工作人员也被降本增效了,会发生什么?顾客找不到电影院在哪里,找不到餐厅,找不到卫生间,甚至找不到出口!
然后我们再看看那个 504 错误 Gateway Time-out。作为程序员看到这个错误,DNA 动了,我第一反应就是:"这是网关层面的问题!"
504 错误是什么呢?就是负责接受和转发请求的网关服务器,在等待后端服务响应的时候超时了。用人话说,就像你给朋友打电话,电话是通了,但是朋友在那边一直不说话,你等啊等,最后实在等不下去了,就挂掉了。
这就更证实了我刚才的分析啊,请求能到达 B 站的大门口,但是门口的接待员找不到或者联系不上里面具体负责的部门来处理请求,等来等去就超时了。
还有一个很有意思的点,据说这次只有 10% 左右的请求失败。这个数据其实挺有信息量的!为什么不是 100% 都挂了呢?
这说明几个问题:第一,B 站肯定部署了多个 Discovery 服务实例,专业术语叫 集群部署。就像商场不会只有一个导购台,而是有好几个,其中一部分坏了,其他的还能用。第二,可能有一些 容错机制 在起作用,比如缓存机制,没办法从服务器获取到最新的信息,咱就退而求其次,直接把之前加载过临时存在服务器内的数据返回给用户,这就是为什么有些朋友看到的推荐内容是乱七八糟的。
第三,可能有 降级策略,就是当主要的 Discovery 服务不可用时,会启用备用的服务发现机制。
如下图,官方 0 粉丝名场面,本质上也是一种降级(或者缓存):

最后一个现象也很有意思,就是直播没有中断,但是弹幕会时不时丢失。这就体现了微服务架构的特点 —— 不同的业务域是相对独立的。
直播服务和弹幕服务虽然都是B站的功能,但是它们在技术架构上可能属于不同的服务集群。直播服务可能有自己独立的服务发现机制,或者它使用的 Discovery 集群比较稳定;而弹幕服务可能更依赖于出故障的那个 Discovery组件。
事故的启示
吃瓜归吃瓜,这次事故也能带给我们程序员一些技术启示:
1)基础设施的重要性:Discovery 这种基础服务,虽然用户看不见,但是一旦出问题,影响面巨大
2)高可用设计的必要性: 5% - 10% 的失败率说明 B 站的容灾设计还是有效的,否则就是 100% 崩溃,所以大家不要再反讽我们 B 站技术总监毛剑大大出品的《B 站高可用架构实践》课了。

3)监控和告警的价值: 能够快速定位到 Discovery 故障,说明监控系统还是给力的。不给力也没办法啊,我们热情友好的 B 友们都是人工监控,这压力给的足足的。

最后
说实话,作为一个程序员,看到这种大厂故障,心情是复杂的。。。
一方面,会有一种 “同行不易” 的感慨。在互联网公司当程序员,最怕的就是半夜被故障电话叫起来,然后开始疯狂排查问题、修复系统。今晚 B 站的技术小哥们肯定是在拼命救火。

另一方面,这也提醒我们,再大的平台也会有故障,技术的世界没有 100% 的完美。
最后,阿 B 咱就是说,这么大的故障,高低得送一波大会员补偿一下是不是?就当给我们这些热情用户一点点打工费嘛。
如果你也是程序员,欢迎在评论区分享你对这次故障的看法;如果你是普通用户,希望我的分析能帮你理解技术故障背后的原理,吃瓜吃的更懂。
记得点赞关注鱼皮,下次大厂出故障,我继续带大家从技术角度吃瓜!好吧,我希望世界和平~
更多编程学习资源
刚刚 B站又血崩了?!我来告诉你真正原因的更多相关文章
- chrome console的使用 : 异常和错误的处理 – Break易站
		
本文内容来自:chrome console的使用 : 异常和错误的处理 – Break易站 利用 Chrome DevTools 提供的工具,您可以修复引发异常的网页和在 JavaScript 中调试 ...
 - B 站崩了,受害程序员聊聊
		
非吃瓜,B 站事件始末分析 + 防治技术分享 大家好,我是鱼皮,昨天小破站崩了的事情相信很多朋友都听说了. 这要是搁以前,不爱吃瓜的我根本不会去关注这种事,崩了就崩了呗,反正天塌下来有程序员大佬们扛着 ...
 - 初涉C#防止黑客攻击站短
		
一.同一个IP如果在一分钟内连续发送5个站短可以认为是不正确的,原因有2方面: 1.发站短的页面是有点击按钮,点击按钮后马上按钮会变为不可点击,所以在前端要防止点击一次触发多次的情况 2.发送短信的U ...
 - pageadmin建站软如何修改和设置iis站点应用程序池
		
很多用户第一次安装PageAdmin建站系统时候会出现这个错误,主要原因: 1.首选打开iis站点基本设置,可以看到当前站点对应的应用程序池,如下图: 可以看到当前站点用的程序池名为MyAppPool ...
 - 从996到ICU——我们终将被自我厌恶
		
自从996.icu在github上收获了18万点赞以来,超时工作,超负荷劳动似乎成了天下所有“无产阶级者”的共同点.对于这样的剥削制度,我想再多的批评和抨击都不为过.但是今天我想说3个小故事,只为引起 ...
 - 4-3 管理及IO重定向
		
1. 系统设定默认输出设备:标准输出(STDOUT,1) 系统设定默认输入设备:标准输入(STDIN,0) 系统设定默认错误设备:标准错误(STDERR,2) 2. 标准输入:键盘 标准输出和错误输出 ...
 - C#语言和数据库基础
		
第一章 第一个C#程序 Vs2012密钥 RBCXF-CVBGR-382MK-DFHJ4-C69G8 01..net和C#的区别 大概在2000年,微软推出了一种革命性的产品--.NET(战略) 目标 ...
 - DevOps is dirty work - CI drives you crazy
		
一直很想谈谈Continuous Integration(CI),持续集成. 就在不久前一次朋友聚会上,一个刚刚跳槽到一家创业公司的朋友跟我抱怨说他们没有CI,没有code review,要做点事太累 ...
 - 向苹果App Store提交新应用的图文教程(转)
		
当你克服重重困难终于开发出了自己的App,下一步就是向App Store提交应用了,这时应该如何操作呢?我的App真的准备好提交了?我敢肯定这些问题将会浮现在你的脑海.基于这篇教程,我将告诉你一个完整 ...
 - 【转】如何保护自己的QQ号
		
账号丢失的原因 账号被注销 长时间未登陆 如果你的QQ号是普通号码,在连续三个月不登陆的情况下,腾讯公司会自动收回你的账号,也就意味着这个QQ号码从此再也不属于你了,会员号码是不会被收回的,要想不被收 ...
 
随机推荐
- 通过 API 将Deepseek响应流式内容输出到前端
			
要实现通过 API 将流式内容输出到前端,可以采用以下技术方案(以 Python 后端 + 前端 JavaScript 为例): 方案一:使用 Server-Sent Events (SSE) 这是浏 ...
 - 程序员必看 Linux 常用命令(重要)
			
文件操作命令 find find 用于在指定目录下查找文件或子目录,如果不指定查找目录,则在当前目录下查找 命令格式:find path -option [-print] [ -exec/-ok co ...
 - SQLSTATE[HY000] [2002] Connection refused报错 PHP连接docker容器中的mysql
			
Laradock 是基于 Docker 提供的完整 PHP 本地开发环境 在框架中连接 MySQL 时 报错 SQLSTATE[HY000] [2002] Connection refused 主要还 ...
 - Django实战项目-学习任务系统-发送邮件通知
			
接着上期代码内容,继续完善优化系统功能. 本次增加发送邮件通知功能,学习任务系统发布的任务,需要及时通知到学生用户知晓. 由于目前智能手机普及,人人都离不开手机,所以手机端接收通知信息更加及时有效. ...
 - Spring定时任务的秘密
			
Spring定时任务的秘密 在 Spring 框架中,定时任务主要通过 @Scheduled 注解或 TaskScheduler 接口实现. 1.基本使用 在 Spring Boot 项目中,通过 @ ...
 - picoctf general skills-easy 部分题目详解(1)
			
实验介绍: ctf竞赛(Capture The Flag)是网络安全技术人员代替真实攻击,比拼技术的竞赛. 又名夺旗赛,是以拿到flag为目标的比赛. picoctf上的题目比较适合新手练习. 但是注 ...
 - 【Python】Flask API 登录
			
Flask API 登录 零.起因 最近要写uniapp客户端,服务器使用的是Python的Flask框架,为了实现用户登录,在网上查到了一些Flask的扩展,其中比较简单的就是flask_httpa ...
 - 大量数据topk-分桶+堆+多路并归解决方案
			
利用分桶.堆与多路归并解决 TopK 问题:结果处理阶段解析 在处理大规模数据时,TopK 问题是一个常见且具有挑战性的任务,即从海量数据中找出最大(或最小)的 K 个元素.为了高效地解决这个问题,我 ...
 - 将Particle转成UGUI
			
在unity官方论坛看到的一个解决方案,可以将Particle直接转换成CanvasRenderer元素显示.新建一个UIParticleSystem.cs脚本,将以下代码复制进去: using Un ...
 - shader中的if语句优化
			
可以借用lerp和step来拼接模仿语句 lerp(a,b,step(value,c))