第一章:可靠、可扩展与可维护的应用系统
第一章可靠、可扩展与可维护的应用系统这一章是全书的总纲。Kleppmann 不讨论任何具体技术而是先确立评价一切数据系统的三个基本维度可靠性、可扩展性、可维护性。后续每一章的技术权衡最终都可以归结为在这三者之间的取舍。一、为什么需要这三个维度现代应用系统早已不是一台机器跑一个程序的形态。一个典型系统可能包含数据库存储状态缓存加速读取搜索索引支持全文检索消息队列异步解耦批处理框架离线分析这些组件通过网络连接运行在多台机器上。系统一旦复杂就会面临三类根本问题出错时怎么办→ 可靠性数据量/流量增长时怎么办→ 可扩展性长期维护和演化怎么办→ 可维护性这三个问题构成了全书所有讨论的出发点。二、可靠性Reliability1. 定义系统在出现故障fault时仍能继续正确工作。这里有一个关键区分术语含义例子故障fault系统的一部分偏离正常状态一块硬盘坏了、一个进程崩溃失效failure系统整体停止提供服务整个数据库不可用可靠性高的系统不是不会出故障而是故障不会升级为失效。这就是所谓的容错fault-tolerant或韧性resilient。2. 故障的三种来源Kleppmann 把故障分为三类这个分类贯穿全书1硬件故障硬盘损坏、内存位翻转、电源故障、网络中断传统做法冗余RAID、双电源、备用机器现实在大规模集群中硬件故障是常态而非例外。Google 的统计显示同时有数千块硬盘在坏。趋势从单机高可靠转向软件层面容忍多机故障2软件故障系统性 bug、配置错误、级联失效特点跨节点相关——一个 bug 可能同时击垮所有副本例子2012 年某公司因一个配置错误导致全网瘫痪闰秒 bug 导致多系统同时崩溃难点软件故障没有冗余能直接解决因为所有副本跑的是同一份代码3人为错误运维误操作、配置失误、代码逻辑错误统计上人为错误是导致系统失效的首要原因应对策略设计能最小化犯错机会的接口如安全默认值提供沙箱环境测试快速回滚机制完善的监控与遥测3. 可靠性的价值对用户数据不丢失、服务不中断对企业声誉、收入、合规对工程师可靠性是可以被设计的而不是靠运气三、可扩展性Scalability1. 定义系统应对负载增长的能力。关键点可扩展不是一个二元属性而是一个动态问题。不能简单说系统 X 可扩展而要说系统 X 在负载从 A 增长到 B 时用什么手段应对。2. 第一步描述负载在讨论扩展之前必须先量化负载。不同系统的负载参数不同Web 服务每秒请求数RPS数据库读写比例、缓存命中率社交网络粉丝数分布幂律分布少数用户有海量粉丝聊天系统消息发送速率、在线用户数关键洞察平均值会骗人。必须看分布尤其是尾部。3. 第二步描述性能两个核心指标1吞吐量Throughput单位时间处理的请求数/数据量适合批处理、消息队列等场景2响应时间Response Time从发出请求到收到响应的时间注意响应时间不是一个固定值而是一个分布百分位数Percentile——本章最重要的概念之一p50中位数一半请求快于此值p95、p99、p999尾部延迟为什么关注尾部尾部延迟直接影响用户体验一个用户可能同时发多个请求只要一个慢就整体慢尾部延迟往往由排队引起而排队是系统过载的早期信号尾延迟放大Tail Latency Amplification如果一个用户请求需要调用 100 个后端服务只要 1 个慢整体就慢。所以 p99 的 1% 会变成用户侧的 63%。实践建议监控 p95/p99而非只看平均值用直方图而非平均值来聚合延迟在高负载下尾部延迟会急剧恶化4. 第三步应对负载增长两种基本策略1垂直扩展Scaling Up换更强的机器更多 CPU、内存、磁盘优点简单无需改代码缺点成本非线性增长有物理上限2水平扩展Scaling Out增加更多机器分布式处理优点理论上无上限成本线性缺点复杂性剧增分区、复制、一致性Kleppmann 的核心观点没有万能的可扩展架构。适合 10 万用户的架构未必适合 1000 万用户。可扩展性是针对特定负载的需要根据实际访问模式来设计。例子读多写少 → 加缓存、加读副本写多读少 → 分区、LSM-Tree 存储复杂查询 → 列式存储、预聚合四、可维护性Maintainability1. 定义系统在长期运行中能被团队高效地理解、修改、扩展和运维。Kleppmann 指出软件的大部分成本不在初始开发而在持续维护。维护包括修复 bug适应新需求迁移到新平台应对新负载修复技术债务2. 可维护性的三个设计原则1可运维性Operability让运维团队能轻松保持系统运行。具体包括提供良好的监控与日志支持自动化部署与配置避免依赖特定机器的雪花服务器提供清晰的文档与操作手册支持滚动升级、回滚2简单性Simplicity降低系统的复杂度让新工程师能快速理解。复杂性的表现状态空间爆炸隐式依赖命名混乱过度抽象应对手段抽象好的抽象能隐藏实现细节如 SQL 隐藏了存储引擎消除偶然复杂性区分本质复杂性问题本身难和偶然复杂性工具/设计导致的难模块化、清晰的接口3可演化性Evolvability让系统能适应需求变化。也称为可扩展性extensibility或可修改性modifiability。关键点需求永远在变系统必须能跟着变数据模型、接口、协议都要支持演化这与第四章编码与演化直接呼应五、本章的核心思想总结维度核心问题关键概念应对手段可靠性出错时能否继续工作故障 vs 失效冗余、隔离、快速恢复可扩展性负载增长时能否应对百分位数、尾延迟垂直/水平扩展、针对性设计可维护性长期能否高效维护可运维、简单、可演化抽象、自动化、良好接口三个贯穿全书的底层判断没有免费的午餐可靠性、可扩展性、可维护性之间经常需要权衡。没有万能方案所有技术选型都必须结合具体负载和场景。复杂性是最大的敌人好的系统设计本质上是不断对抗复杂性的过程。六、这一章在全书中地位第一章确立了全书的价值坐标系后面讲复制、分区、事务、共识时每个技术选择都要回答“它对可靠性、可扩展性、可维护性分别意味着什么”例如单主复制提高了一致性可靠性但牺牲了写可扩展性无主复制提高了可用性但增加了冲突处理的复杂性可维护性下降。一句话概括本章数据系统的设计本质上是在可靠性、可扩展性、可维护性这三个维度上针对具体负载和场景做出清醒的、有意识的权衡。

相关新闻

胰岛素依非索肽(Onswik/Efsitora)获FDA批准:成人2型糖尿病每周一次基础胰岛素

胰岛素依非索肽(Onswik/Efsitora)获FDA批准:成人2型糖尿病每周一次基础胰岛素

资讯日期:2026年9月24日2026 年 9 月 24 日,FDA 批准礼来公司的依非索肽胰岛素(胰岛素 efsitora alfa-gobe,商品名 Onswik)用于成人 2 型糖尿病,作为饮食和运动的辅助手段以改善血糖控制。Onswik 是一种每周…

2026/9/29 18:08:44 阅读更多 →
Claude Code示范案例-快速原型开发

Claude Code示范案例-快速原型开发

**场景**:创建一个简单的 React 组件bash # 方式1:直接命令 claude "创建一个用户登录表单组件,包含用户名、密码输入框和提交按钮,使用 React Hooks 管理状态"# 方式2:交互式对话 claude > 创建一个分页…

2026/9/29 18:07:49 阅读更多 →
《数据密集型应用系统设计》(DDIA)的章节脉络可以概括为:从单机数据系统的基石,走向分布式数据的复杂挑战,最终抵达衍生数据与系统组合的未来

《数据密集型应用系统设计》(DDIA)的章节脉络可以概括为:从单机数据系统的基石,走向分布式数据的复杂挑战,最终抵达衍生数据与系统组合的未来

《数据密集型应用系统设计》(DDIA)的章节脉络可以概括为:从单机数据系统的基石,走向分布式数据的复杂挑战,最终抵达衍生数据与系统组合的未来。以下按全书三部分、共十二章逐一详解。 第一部分:数据系统的基…

2026/9/29 18:07:50 阅读更多 →

最新新闻

AI项目总翻车?四个风险域框架帮你系统排查

AI项目总翻车?四个风险域框架帮你系统排查

1. 从“四个风险域”说起:为什么AI项目总在同一个地方翻车做AI项目这些年,我越来越觉得,真正让项目翻车的往往不是模型不够强,而是团队对风险的认知太窄。很多人一提AI风险,脑子里只有“模型会不会胡说八道”这一件事&…

2026/9/30 8:21:47 阅读更多 →
接口安全测试:容易被忽略的 API 高危漏洞盘点

接口安全测试:容易被忽略的 API 高危漏洞盘点

接口安全测试:容易被忽略的 API 高危漏洞盘点 前言 现在前后端分离、小程序、APP、H5 业务,几乎所有交互都依靠 API 接口。很多安全测试人员习惯性使用扫描器,重点检测 SQL 注入、XSS 这类传统 Web 漏洞。但 API 场景下,大量高危…

2026/9/30 8:21:47 阅读更多 →
IS62WV102416BLL替代EMI国产高速异步SRAM

IS62WV102416BLL替代EMI国产高速异步SRAM

在工控主板、通信设备、运动控制器等硬件设计中,IS62WV102416BLL是ISSI一款非常经典的16Mbit(1024K16)高速异步CMOS SRAM。器件采用2.4V‑3.6V供电,25ns访问速度,配备CS1、CS2双片选控制,支持UB#、LB#高低字…

2026/9/30 8:21:47 阅读更多 →
大模型训练显存优化:参数空间切分实战指南

大模型训练显存优化:参数空间切分实战指南

1. 参数空间切分到底在解决什么问题 大模型训练这件事,外行看热闹,内行看显存。很多人第一次接触LLM训练时,最直观的感受就是:模型大得离谱,显存永远不够,训练速度永远比预期慢。但真正做过一段时间之后你会…

2026/9/30 8:21:47 阅读更多 →
Node.js升级全指南:从LTS版本选择到全局包迁移避坑

Node.js升级全指南:从LTS版本选择到全局包迁移避坑

写这篇文章之前,我先说个背景。很多前端朋友都有过这种经历:项目起来了,一运行发现node -v还是 16 甚至 14,新版框架要求 Node 20,或者某些依赖报错,最后排查半天发现是 Node 版本太低。升级 Node.js 这个操…

2026/9/30 8:21:47 阅读更多 →
全覆盖路径规划:往返式扫描与A*转移的Matlab实现

全覆盖路径规划:往返式扫描与A*转移的Matlab实现

做全覆盖路径规划的人,多半都是先被 A* 算法领进门的。搜“路径规划算法”,A* 永远是出场率最高的那个,网上资料多、Matlab 代码也好找。但如果你直接把 A* 拿去解决“覆盖”问题——比如扫地机器人要把房间完整扫一遍、植保无人机要把一块田…

2026/9/30 8:20:47 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 8:16:59 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/29 8:24:48 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →