本文 首发于 🌱 煎茶转载 请注明 来源

发布!设计与部署稳定的分布式系统(第2版) 迈克尔·尼加德 16个笔记

◆ 译者序

因为很多开发人员在考虑分布式系统稳定性的设计时,会假设生产环境处于产品运行最理想的状态,且用户的行为是理智、可预见的。

◆ 前言

不具备稳定性的系统,就是不可用的系统。

系统不应该崩溃、停止响应、丢失数据、侵犯隐私、损失金钱、摧毁公司,或者“杀死”客户。

大多数软件是为软件开发实验室或QA部门的测试工程师设计的。

今天的软件设计类似于20世纪90年代早期的汽车设计,它们都与现实世界脱节。

在实验室这种宁静空间里,设计师所做出的设计既是那么地优雅、复杂、精巧,又是那么地脆弱、不中用,最终早早被淘汰

如今大多数的软件架构和设计,同样在干净、稳定却与现实相差甚远的环境中进行。

软件只有产品化才能产生价值。

◆ 第一部分 创造稳定性

拥有数百架飞机和几万名员工的这家价值数十亿美元的全球性航空公司,被迫停飞的原因只是一个未被捕获的SQLException异常。

威胁系统寿命的主要敌人是内存泄漏和数据增长。

一旦创建套接字,TCP连接就可以保持好几天,而且无须任何一方发送数据包。只要两个终端计算机内存中都具有该套接字状态,那么“连接”就仍然有效。路由可以改变,物理链路可以被断开和重新连接,这些都没关系,只要终端的两台计算机认为“连接”确实存在,那么“连接”就会持续存在。

这个例子的主要教训是,不是每个问题都可以在它所体现的抽象层面上来解决。有时候,这些原因会在各个层面上下交织。

Redis是将内存移出进程的另一个流行工具。它是一种快速的“数据结构服务器”,其定位介乎缓存和数据库之间。

会话是Web应用程序的命门死穴

会话的作用就是在内存中缓存数据。

早期的通用网关接口应用程序不需要会话,因为它们会为每个新请求启动一个新进程(通常是一个Perl脚本)。