当前位置:网站首页>从 B 站崩溃报告看分布式系统的技术栈
从 B 站崩溃报告看分布式系统的技术栈
2022-07-17 06:53:00 【java_beautiful】
前言
不知道大家还记得去年 B 站(哔哩哔哩)挂了那次严重的事故不,记得当时在全网也是引起了热议。
离当时过去刚好一年多的时间,今天看到 B 站前两天在公众号上发的复盘报告。2021.07.13 我们是这样崩的 文章从八个方面全链路再现了当时事故发生和处理的全过程:
包括至暗时刻,初因定位,故障止损,根因定位,原因说明,问题分析,优化改进,总结。
不知道大家看过没,我全文看了一下,看完还挺唏嘘的,最终原因竟然是一个字符串类型的数字参数 0 导致的死循环。
不过文章本身写的还是非常专业和严谨,对于咱们技术的同学,好嘛,也是一次难得的学习机会。
只是,看到文章最后一段代码,我实在忍不住多说几句,一个求最大公约数的GCD 函数,居然就是导致 B 站崩溃的元凶..
因为,下面这段代码对我来说实在太熟悉不过了,在学校搞过程序竞赛的同学应该对它都不陌生吧。

看到上面的报告,第一感觉是因为没有做好类型转换带来的死循环,是个弱类型设计的坑,如果除零是抛出异常而不是变 NaN,应该很快就能定位到问题所在。
另外,从官方的这份报告里,我看到了多次提及多活,容灾,分布式这个词汇,异地多活是常见的分布式系统保证架构稳定性的一个方案。
毕竟这么体量的公司,系统架构肯定和分布式是绕不开的。那咱们以此来看看,分布式系统里面都有哪些技术栈呢?
之前记得在左耳朵耗子叔的专栏《左耳听风》里专门有写分布式架构,我把里面的部分内部摘抄在这里给大家分享。
构建分布式系统的目的是增加系统容量,提高系统的可用性,转换成技术方面,也就是完成下面两件事。
- 大流量处理。通过集群技术把大规模并发请求的负载分散到不同的机器上。
- 关键业务保护。提高后台服务的可用性。
说白了就是干两件事。一是提高整体架构的吞吐量,服务更多的并发和流量,二是为了提高系统的稳定性,让系统的可用性更高。
提高架构的性能
咱们先来看看,提高系统性能的常用技术。

缓存系统。加入缓存系统,可以有效地提高系统的访问能力。比如从前端的浏览器,到网络,再到后端的服务,底层的数据库、文件系统、硬盘和 CPU,全都有缓存,这是提高快速访问能力最有效的手段。对于分布式系统下的缓存系统,需要的是一个缓存集群。比如用一个 Proxy 来做缓存的分片和路由。
负载均衡系统。负载均衡系统是水平扩展的关键技术,它可以使用多台机器来共同分担一部分流量请求。
异步调用。异步系统主要通过消息队列来对请求做排队处理,这样可以把前端的请求的峰值给“削平”了,所谓削峰填谷。而后端通过自己能够处理的速度来处理请求。这样可以增加系统的吞吐量,但是实时性就会有影响。同时,还会引入消息丢失的问题,所以要对消息做持久化,这会造成“有状态”的结点,从而增加了服务调度的难度。
数据分区和数据镜像。数据分区是把数据按一定的方式分成多个区(比如通过地理位置),不同的数据区来分担不同区的流量。这需要一个数据路由的中间件,而数据镜像是把一个数据库镜像成多份一样的数据,这样就不需要数据路由的中间件了。可以在任意结点上进行读写,内部会自行同步数据。然而,数据镜像中最大的问题就是数据的一致性问题。
提高架构的稳定性
接下来,咱们再来看看提高系统系统稳定性的一些常用技术。

服务拆分。服务拆分主要有两个目的:一是为了隔离故障,二是为了重用服务模块。但服务拆分完之后,会引入服务调用间的依赖问题。
服务冗余。 服务冗余是为了去除单点故障,并可以支持服务的弹性伸缩,以及故障迁移。然而,对于一些有状态的服务来说,冗余这些有状态的服务带来了更高的复杂性。其中一个是弹性伸缩时,需要考虑数据的复制或是重新分片,迁移的时候还要迁移数据到其它机器上。
限流降级。当系统实在扛不住压力时,只能通过限流或者功能降级的方式来停掉一部分服务,或是拒绝一部分用户,以确保整个架构不会挂掉。这些技术属于保护措施。
高可用架构。通常来说高可用架构是从冗余架构的角度来保障可用性。比如,多租户隔离,灾备多活,或是数据可以在其中复制保持一致性的集群。总之,就是为了不出单点故障。
高可用运维。高可用运维指的是 DevOps 中的 CI/CD(持续集成 / 持续部署)。一个良好的运维应该是一条很流畅的软件发布管线,其中做了足够的自动化测试,还可以做相应的灰度发布,以及对线上系统的自动化控制。这样,可以做到“计划内”或是“非计划内”的宕机事件的时长最短。上述这些技术非常有技术含量,而且需要投入大量的时间和精力。
正如不想当将军的士兵不是好士兵,不想当架构师的程序员不是一个好的程序员,哈哈,道阻且长,慢慢加油吧。
边栏推荐
- By voting for the destruction of STI by Dao, seektiger is truly community driven
- Regular expression extraction of matching content
- RNN convolutional neural network
- [MySQL] transaction: basic knowledge of transaction, implementation principle of MySQL transaction, detailed explanation of transaction log redolog & undo
- Ku115 FPGA high performance 10G Optical fiber network hardware accelerator card / 2-way 10G Optical fiber data accelerator card
- Complete square number
- Kingbasees can realize any of MySQL by constructing an aggregate function_ Value function.
- 真实案例:系统上线后Cpu使用率飙升如何排查?
- 【特征工程】
- 【Kernel】驱动开发学习之字符设备
猜你喜欢

V8 引擎如何进行垃圾内存的回收?

Pytorch notes (5)

Discussion sur la technologie RISC - V

175. Combine two tables (MySQL database connection)

Forecast sales xgboost

Semiconductor material technology

才意识到自己“奇葩”的360,会不会有些晚?
![Paddleserving服务化部署 tensorrt报错, shape of trt subgraph is [-1,-1,768],](/img/15/5dde91261a44fcfeda4d8436bb8559.png)
Paddleserving服务化部署 tensorrt报错, shape of trt subgraph is [-1,-1,768],

DP动态规划企业级模板分析(数字三角,上升序列,背包,状态机,压缩DP)

代码学习(DeamNet)CVPR | Adaptive Consistency Prior based Deep Network for Image Denoising
随机推荐
经典通用的Pbootcms花卉网站模板源码,自适应手机端,带后台管理
本地存储 sessionStorage
How to check whether the app has user information and data leakage vulnerabilities
The website vulnerability repair service provider analyzes the ultra vires caused by controllable parameters
Redis transaction
CCF-CSP《202206-2—寻宝!大冒险!》
在线问题反馈模块实战(五):实现对通用字段内容自动填充功能
Wechat oauth2.0 login process and security analysis
会话技术【黑马入门系列】
Junit5
Error received from peer ipv4/Connection reset by peer Paddleserving服务化部署后报错
Facial key point detection CNN
Xinlinx zynq7010 domestic replacement fmql10s400 national production arm core board + expansion board
CAD fill to polyline script
How to associate the application on enterprise wechat with the Sybase database of the store
WPF 三维应用搭建(基础)
Modify the select style
Pytorch notes (5)
Paddleserving服务化部署 tensorrt报错, shape of trt subgraph is [-1,-1,768],
Regular expression extraction of matching content