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站又血崩了?!我来告诉你真正原因的更多相关文章

  1. chrome console的使用 : 异常和错误的处理 – Break易站

    本文内容来自:chrome console的使用 : 异常和错误的处理 – Break易站 利用 Chrome DevTools 提供的工具,您可以修复引发异常的网页和在 JavaScript 中调试 ...

  2. B 站崩了,受害程序员聊聊

    非吃瓜,B 站事件始末分析 + 防治技术分享 大家好,我是鱼皮,昨天小破站崩了的事情相信很多朋友都听说了. 这要是搁以前,不爱吃瓜的我根本不会去关注这种事,崩了就崩了呗,反正天塌下来有程序员大佬们扛着 ...

  3. 初涉C#防止黑客攻击站短

    一.同一个IP如果在一分钟内连续发送5个站短可以认为是不正确的,原因有2方面: 1.发站短的页面是有点击按钮,点击按钮后马上按钮会变为不可点击,所以在前端要防止点击一次触发多次的情况 2.发送短信的U ...

  4. pageadmin建站软如何修改和设置iis站点应用程序池

    很多用户第一次安装PageAdmin建站系统时候会出现这个错误,主要原因: 1.首选打开iis站点基本设置,可以看到当前站点对应的应用程序池,如下图: 可以看到当前站点用的程序池名为MyAppPool ...

  5. 从996到ICU——我们终将被自我厌恶

    自从996.icu在github上收获了18万点赞以来,超时工作,超负荷劳动似乎成了天下所有“无产阶级者”的共同点.对于这样的剥削制度,我想再多的批评和抨击都不为过.但是今天我想说3个小故事,只为引起 ...

  6. 4-3 管理及IO重定向

    1. 系统设定默认输出设备:标准输出(STDOUT,1) 系统设定默认输入设备:标准输入(STDIN,0) 系统设定默认错误设备:标准错误(STDERR,2) 2. 标准输入:键盘 标准输出和错误输出 ...

  7. C#语言和数据库基础

    第一章 第一个C#程序 Vs2012密钥 RBCXF-CVBGR-382MK-DFHJ4-C69G8 01..net和C#的区别 大概在2000年,微软推出了一种革命性的产品--.NET(战略) 目标 ...

  8. DevOps is dirty work - CI drives you crazy

    一直很想谈谈Continuous Integration(CI),持续集成. 就在不久前一次朋友聚会上,一个刚刚跳槽到一家创业公司的朋友跟我抱怨说他们没有CI,没有code review,要做点事太累 ...

  9. 向苹果App Store提交新应用的图文教程(转)

    当你克服重重困难终于开发出了自己的App,下一步就是向App Store提交应用了,这时应该如何操作呢?我的App真的准备好提交了?我敢肯定这些问题将会浮现在你的脑海.基于这篇教程,我将告诉你一个完整 ...

  10. 【转】如何保护自己的QQ号

    账号丢失的原因 账号被注销 长时间未登陆 如果你的QQ号是普通号码,在连续三个月不登陆的情况下,腾讯公司会自动收回你的账号,也就意味着这个QQ号码从此再也不属于你了,会员号码是不会被收回的,要想不被收 ...

随机推荐

  1. Arrays工具类教你优雅地管理数组数据

    数组专用工具类指的是 java.util.Arrays 类,基本上常见的数组操作,这个类都提供了静态方法可供直接调用.毕竟数组本身想完成这些操作还是挺麻烦的,有了这层封装,就方便多了. package ...

  2. Docker之一简介

    什么是Docker Docker是Google使用go语言进行开发的,对进程进行封装隔离,始于操作系统层面的虚拟化技术. 因为隔离的进程独立于宿主机和其它的隔离进程,因此成为容器 Docker在容器的 ...

  3. Momentum Contrast for Unsupervised Visual Representation Learning论文精读

    目录 Birth of MoCo Supervised Learning Contrastive Learning MoCo Dictionary Limits of the early learni ...

  4. TdxpageControl融合窗口和free

    for I := cxpgcntrl1.PageCount - 1 downto 0do begin if cxpgcntrl1.Pages[i].Caption <> '首页' then ...

  5. 【保姆级教程】windows 安装 docker 全流程

    一.背景 许多小伙伴在安装 Dify 或是 RagFlow 这些工具的时候,往往会遇到一个难题,那就是 Docker 的安装. 首先,我们的PC安装的绝大部分是 Windows,但众所周知的原因,Wi ...

  6. 房价预测数据清洗全流程:从数据采集到可视化分析(Python实战)

    在房价预测项目中,数据清洗是至关重要的环节.它不仅决定了模型的准确性,还直接影响后续分析的可靠性.本文将以波士顿房价数据集为例,通过Python的Pandas.Matplotlib等工具,详细讲解数据 ...

  7. AI工具推荐:使用AnythingLLM帮助你学习

    AnythingLLM介绍 AnythingLLM 是一个最容易使用的全能 AI 应用,可以进行 RAG.AI 代理等多种功能,无需编写代码或担心基础设施问题. GitHub地址:https://gi ...

  8. 使用 StreamJsonRpc 在 ASP.NET Core 中启用 JSON-RPC

    StreamJsonRpc 是微软开发的一个开源库,用于在 .NET 平台中实现基于 JSON-RPC 2.0 规范 的远程过程调用(RPC).它通过流(如管道.网络流等)实现高效的跨进程或跨网络通信 ...

  9. 阿里云服务器中Linux下centos7.6安装JDK

    一.下载jdk安装包 wget https://imcfile.oss-cn-beijing.aliyuncs.com/shizhan/file/liaoshixiong/jdk-8u231-linu ...

  10. 在 Idea 中使用 Git

    以 git-2.21.0 为例说明安装步骤: 双击 Git-2.21.0-64-bit.exe 点击 Next 设置安装路径 点击 Next 点击 Next 点击 Next,选择默认的编辑器 点击 N ...