《Node.js 内部原理》系列原班人马新系列上线。上一系列回答「系统如何工作」,这一系列回答「系统在停止工作时如何生存」。第一集纯谈思维方式,先搞懂这个,后续所有模式都会显得顺理成章。
核心转变:程序员认为「我的代码正确,系统就会正常工作」;工程师认为「我的代码可能完全正确,但代码周围的一切仍然可能出故障」。数据库、网络、云服务商、RAM、CPU,甚至明天部署代码的人——没有什么是保证可靠的。
用飞机冗余类比:飞机在空中可能引擎停转、传感器失灵、GPS丢失、液压系统故障……但不会立即坠毁,因为飞机在设计时就假定故障会发生,而非希望它不发生。后端系统需要相同心态。
拆解一个最简 Node.js + MySQL API:数据库会挂吗?Redis会挂吗?网络会断吗?服务器会OOM吗?CPU会过载吗?云服务商宕机?开发者部署bug?用户输入垃圾数据?外部API变慢?——每个问题答案都是「是」。
高级工程师构建登录功能时,会连锁追问:MySQL挂了怎么办?Redis不可用?JWT验证失败?邮件服务缓慢?两个登录请求同时到达?服务器重启时正在登录?这种习惯区分了能存活于生产环境的系统和只能活在笔记本上的系统。
分布式系统黄金法则:任何可能出故障的事物最终都会出故障。你的工作不是让故障不可能发生,而是确保当故障发生时,系统能察觉、优雅处理并恢复。程序员眼中的「工作」:我的功能能运行。工程师眼中的「工作」:即使周围出问题了,我的功能也能运行。
真实案例:Netflix大部分运行在AWS上。AWS本身会发生宕机、服务器死亡、可用区故障。Netflix没有寄希望于AWS永不故障,而是构建了Chaos Monkey——在正常上班时间故意在生产环境杀掉自己的服务器。这样就能在非紧急情况下发现弱点并修复。
即使是飞机,也存在即便所有备份系统都正常运作也无法恢复的极端灾难。工程的目标从来不是零故障,而是把灾难性边缘推得尽可能远,让绝大多数故障被快速检测、处理和恢复。
总结四问:你会快速发现它吗?(检测)你会控制它吗?(处理)你会快速恢复吗?(恢复)你能构建系统让这三件事自动快速完成,而无需人在凌晨3点醒来吗?(韧性模式)
下集预告:故障类型——硬件、软件、网络、数据库、第三方、人为错误和资源耗尽,每个都有真实的生产案例。
#开发者 #工具 #故障工程 #分布式系统 #Nodejs #Netflix #混沌工程 #韧性 #工程思维
@DevToolboxHub