新書推薦:
《
罗马之变(法语直译,再现罗马共和国走向罗马帝国的辉煌历史)
》
售價:NT$
500.0
《
自然之争:1600年以来苏格兰和英格兰北部地区的环境史(新史学译丛)
》
售價:NT$
485.0
《
硝烟下的博弈:工业革命与中西方战争
》
售價:NT$
398.0
《
让内的理性主义 发现无意识之旅
》
售價:NT$
301.0
《
苏美尔文明(方尖碑)
》
售價:NT$
602.0
《
知命不惧:从芝诺到马可·奥勒留的生活艺术
》
售價:NT$
505.0
《
Zemax光学设计从基础到实践
》
售價:NT$
602.0
《
全球化的黎明:亚洲大航海时代
》
售價:NT$
500.0
|
編輯推薦: |
(1)作者背景资深:作者任职于著名互联网科技公司,是服务端开发方面的资深专家。曾就职于华为,获得华为“总裁嘉奖令”,杭州市高层次人才。
(2)作者经验丰富:作者在服务端开发方面有近10年开发经验,长期致力于构建高效、可靠、可扩展的服务端系统,积累了大量优秀实践。
(3)大厂服务端工作法:本书衍生自作者在大厂内部讲授的系列技术培训课程,曾获得阿里技术讲师课程大赛冠军,口碑炸裂。
(4)理论与实践结合:既讲解了服务端开发的流程、规范、技术栈等理论内容,又讲解了典型难题的解决方案。
(5)解决生产实践难题:50 余个案例、200余幅图,系统阐述高并发、高可用、高性能、缓存、幂等、数据一致性等服务端典型难题的解决方案
(6)13位专家力荐:来自蚂蚁、阿里、微软等知名企业和浙大、北大、斯坦福、剑桥等一流大学的13位专家强烈推荐。
|
內容簡介: |
这是一本从开发流程、技术栈、典型问题解决方案和开发规范等维度全面讲解服务端开发的著作。它衍生自作者在某著名互联网科技公司内部讲授的高口碑课程,是作者近10年服务端开发经验的总结,同时融合了业界在服务端开发方面的宝贵项目经验和实践智慧。
本书理论与实践结合,摆脱编程语言、框架、中间件及传统编程思想的束缚,全景式、体系化地阐述了服务端开发,核心内容包括以下两个部分。
第1部分:服务端开发的技术和方法
首先,介绍了服务端开发的职责、技术栈、核心流程和进阶路径;然后,从需求分析、抽象建模、系统设计、数据设计和非功能性设计5个方面展开,结合案例深入讲解了服务端开发的实操方法和重难点,为读者呈现出服务端开发的全景图,帮助读者快速、体系化地掌握服务端开发的相关知识和方法。
第2部分:服务端典型问题的解决方案
针对高并发、高性能、高可用、缓存、数据一致性、幂等、秒杀等服务端开发实践中的典型问题,给出了对应的解决方案和开发规范,同时还结合案例深入分析了不同方案的优缺点。此外,还总结了接口设计、日志打印、异常处理、代码编写、代码注释等落地层面的行业案例和规范。
|
關於作者: |
郭进
浙江大学工学硕士,杭州市高层次人才现任某著名互联网科技公司服务端技术专家先后从事过智能控制算法、分布式中间件和服务端研发。相关成果曾发表于领域顶级会议和SCI期刊。
近年来,致力于构建高效、可靠、可扩展的服务端系统,作为核心成员设计并开发了承载百万级QPS、服务亿级用户的大型分布式系统,在领域建模、系统架构、信息流推荐及研发规范方面积累了大量优秀实践曾获得阿里第二届技术讲师课程大赛冠军、华为“总裁嘉奖令”、浙江省优秀毕业生、NUEDC(全国大学生电子设计竞赛 ) 全国一等奖及瑞萨特别奖、国家奖学金等30余个奖项。
CSDN博客专家,阿里高阶技术“传橙官”,先后在CSDN、“阿里技术”公众号阿里ATA 等平台发表技术文章数百篇,多篇文章入选平台“年度最火文章合集”“年度好评TOP 10”和“头条推荐”
|
目錄:
|
第一部分 技术与方法
第1章 走进服务端开发 2
1.1 服务端开发概述 2
1.1.1 服务端开发的定义 2
1.1.2 服务端开发的职责 4
1.2 服务端开发技术栈 5
1.2.1 编程语言 5
1.2.2 开发工具 6
1.2.3 开发框架 8
1.2.4 数据库与数据存储 10
1.2.5 中间件 14
1.2.6 操作系统 16
1.2.7 应用部署 19
1.2.8 运维监控 22
1.3 服务端开发核心流程 24
1.3.1 需求分析 24
1.3.2 抽象建模 26
1.3.3 系统设计 27
1.3.4 数据设计 30
1.3.5 非功能性设计 31
1.4 服务端开发进阶路径 33
1.4.1 构建能力模型 33
1.4.2 专业知识体系化 34
1.4.3 掌握学习方法 35
1.4.4 技术与业务同行 36
1.4.5 树立正确的观念 37
第2章 需求分析 39
2.1 需求分类 39
2.1.1 产品需求 40
2.1.2 技术需求 40
2.2 需求分析的流程 40
2.2.1 学习领域知识 41
2.2.2 明确业务目标 42
2.2.3 明确业务用例 43
2.2.4 梳理用例场景 44
2.2.5 构建业务模型 45
2.2.6 确认业务规则 47
2.2.7 确认需求 47
2.3 需求分析的常用方法 48
2.3.1 功能分析法 48
2.3.2 数据流分析法 51
2.3.3 面向对象分析法 55
2.4 需求分析的重点和难点 56
2.4.1 统一语言 56
2.4.2 识别问题 57
2.4.3 数据分析 58
2.4.4 细节陷阱 59
第3章 抽象建模 61
3.1 抽象思维 61
3.1.1 软件世界中的抽象 61
3.1.2 提升抽象思维的方法 63
3.2 建模方法 65
3.2.1 问题空间和解决方案空间 65
3.2.2 什么是领域模型 66
3.2.3 为什么要建立领域模型 68
3.2.4 典型的建模方法 69
3.2.5 建模应遵循的3个原则 71
3.3 用例建模法知识储备 73
3.3.1 建模基础 73
3.3.2 什么是用例 74
3.3.3 挖掘用例的5个步骤 75
3.3.4 绘制用例图的6个要素 78
3.4 用例建模法的4个实施步骤 80
3.4.1 提取模型 80
3.4.2 补充属性 81
3.4.3 关系抽象 82
3.4.4 模型验证 84
3.5 建模小结 85
第4章 系统设计 87
4.1 大话系统设计 87
4.1.1 战术编程腐蚀系统 87
4.1.2 系统复杂化的3个特征 88
4.1.3 系统复杂化的3个诱因 89
4.1.4 复杂化应对之道 90
4.2 总体架构 91
4.2.1 什么是架构 91
4.2.2 架构推演 92
4.2.3 设计功能域 94
4.2.4 设计功能域协作 95
4.2.5 明确数据边界 96
4.2.6 架构约束考量 97
4.2.7 逻辑架构粒度 98
4.2.8 小结 98
4.3 内部分层 99
4.3.1 什么是分层 99
4.3.2 功能域内部分层 101
4.3.3 分层原则 103
4.3.4 小结 105
4.4 详细设计 106
4.4.1 设计内容 106
4.4.2 设计原则 107
4.4.3 设计模式 109
4.4.4 小结 110
4.5 一图胜千言 111
4.5.1 绘图工具 111
4.5.2 “4 1”模型 112
4.5.3 C4模型 112
第5章 数据设计 117
5.1 数据设计概述 117
5.1.1 数据设计的步骤 117
5.1.2 概念数据模型 118
5.1.3 逻辑数据模型 119
5.1.4 物理数据模型 120
5.2 数据库的分类 120
5.2.1 关系型数据库 121
5.2.2 NoSQL数据库 122
5.2.3 NewSQL数据库 123
5.3 常用数据库及其适用场景 124
5.3.1 常用的关系型数据库 124
5.3.2 常用的NoSQL数据库 127
5.3.3 存储选型 130
5.4 存储架构演进 131
5.4.1 单机模式 131
5.4.2 独立主机 131
5.4.3 读写分离 132
5.4.4 垂直拆分 132
5.4.5 水平拆分 134
5.4.6 复合存储方案 136
5.5 物理数据表设计 137
5.5.1 表设计 137
5.5.2 字段设计 139
5.5.3 索引设计 140
5.5.4 语句设计 142
第6章 非功能性设计 145
6.1 稳定性设计 145
6.1.1 什么是稳定性 145
6.1.2 容量评估 147
6.1.3 压测摸底 151
6.1.4 风险识别 152
6.1.5 限流方案 152
6.1.6 降级方案 155
6.1.7 监控告警 157
6.2 预案设计 158
6.2.1 为什么要做预案 158
6.2.2 如何做预案 159
6.3 可测性设计 160
6.3.1 可操作 160
6.3.2 可灰度 161
6.3.3 可压测 162
6.4 资金安全设计 162
6.4.1 资损风险分析 162
6.4.2 资损防控三部曲 163
6.4.3 一致性 164
6.4.4 幂等 166
6.4.5 数据核对 167
6.4.6 数据监控 169
6.4.7 应急止损 170
6.5 其他非功能性设计 170
6.5.1 兼容性 171
6.5.2 异常/补偿 172
6.5.3 扩展性 174
第二部分 解决方案
第7章 高并发问题及解决方案 176
7.1 高并发概述 176
7.1.1 并发 176
7.1.2 CPU密集型与I/O密
集型 177
7.1.3 高并发 178
7.2 资源扩展策略 179
7.2.1 垂直扩展 179
7.2.2 水平扩展 180
7.2.3 负载均衡 183
7.3 数据缓存策略 187
7.3.1 本地缓存 187
7.3.2 分布式缓存 194
7.3.3 CDN 197
7.3.4 多级缓存 199
7.3.5 案例解析 200
7.4 流量削峰策略 202
7.4.1 消息队列削峰 202
7.4.2 客户端削峰 205
7.5 服务降级策略 206
7.5.1 降级范围 207
7.5.2 降级的分类 207
7.6 限流策略 208
7.7 基本原则 208
第8章 缓存的典型问题及解决
方案 210
8.1 缓存预热 210
8.1.1 应用启动预热策略 210
8.1.2 任务调度预热策略 211
8.1.3 模拟请求预热策略 215
8.1.4 小结 215
8.2 缓存淘汰 216
8.2.1 LRU 216
8.2.2 LFU 217
8.2.3 ARC 217
8.2.4 FIFO 219
8.3 缓存更新 219
8.3.1 Cache Aside模式 220
8.3.2 Read/Write Through模式 222
8.3.3 Write Behind Caching
模式 223
8.3.4 小结 224
8.4 缓存雪崩 224
8.4.1 缓存常驻策略 224
8.4.2 多级缓存策略 224
8.4.3 过期时间优化策略 225
8.4.4 加锁重建策略 226
8.5 缓存穿透 227
8.5.1 缓存空值策略 227
8.5.2 布隆过滤器策略 227
8.5.3 布谷鸟过滤器策略 231
8.6 缓存热点 232
8.6.1 前置缓存策略 232
8.6.2 热点散列策略 233
第9章 缓存数据与数据库数据一致性
问题及解决方案 235
9.1 CAP 理论简介 235
9.1.1 CAP定义解读 235
9.1.2 三个核心需求不可兼得 236
9.2 缓存数据与数据库数据不一致的
原因 238
9.2.1 操作时序导致数据不一致 238
9.2.2 操作失败导致数据不一致 239
9.2.3 不可实现的绝对一致性 241
9.3 延时双删 242
9.3.1 原理及实施步骤 242
9.3.2 如何确定延时 243
9.3.3 优点与不足 244
9.4 基于binlog异步删除缓存 244
9.4.1 MySQL主从同步原理 244
9.4.2 感知数据库变更 246
9.4.3 客户端订阅变更 246
9.4.4 消息队列订阅变更 247
9.4.5 删除缓存 249
9.5 自动过期加失败补偿 250
第10章 分布式系统幂等问题及
解决方案 251
10.1 幂等概述 251
10.1.1 幂等场景举例 251
10.1.2 什么是幂等 252
10.1.3 为什么需要幂等 253
10.1.4 并发与幂等 254
10.2 幂等实现四部曲 255
10.2.1 副作用分析 255
10.2.2 幂等号设计 255
10.2.3 幂等数据持久化设计 258
10.2.4 幂等处理流程设计 259
10.3 典型幂等策略 261
10.3.1 唯一索引策略 261
10.3.2 悲观锁策略 263
10.3.3 分布式锁策略 264
10.3.4 其他策略 266
10.4 幂等号生成 266
10.4.1 客户端与服务端幂等 266
10.4.2 服务端系统间幂等 268
10.5 幂等注意事项 268
第11章 秒杀系统关键问题及解决
方案 271
11.1 主要技术难点 271
11.1.1 高并发 271
11.1.2 高可用 273
11.1.3 一致性 273
11.1.4 反作弊 274
11.2 电商平台的库存运作全景图 275
11.2.1 库存模型 275
11.2.2 扣减模式 276
11.2.3 扣减执行流程 276
11.2.4 库存查询 277
11.2.5 核心链路 277
11.3 库存架构演进 279
11.3.1 独立主机 279
11.3.2 分库分表 280
11.3.3 热点处理 280
11.4 库存单元化 282
11.4.1 中心化乌云 282
11.4.2 优化困境 285
11.4.3 单元封闭 285
11.4.4 全局库存与局部库存 287
11.4.5 库存回收难点 290
11.4.6 全局库存可见性 292
第12章 常见性能瓶颈及解决
方案 294
12.1 软件性能概述 294
12.1.1 如何理解软件性能 294
12.1.2 软件性能评价指标 295
12.1.3 性能瓶颈与分析要素 296
12.2 CPU 296
12.2.1 线程与进程 297
12.2.2 CPU使用率 300
12.2.3 平均负载 302
12.2.4 CPU使用率与平均负载的
差异 304
12.2.5 瓶颈表征及解决方案 305
12.3 内存 307
12.3.1 内存使用率 308
12.3.2 特殊内存 309
12.3.3 内存回收 310
12.3.4 瓶颈表征及解决方案 311
12.4 磁盘 312
12.4.1 Linux I/O栈 313
12.4.2 磁盘交互 315
12.4.3 主要性能指标 318
12.4.4 瓶颈表征及解决方案 319
第13章 高可用问题及解决方案 321
13.1 高可用概述 321
13.1.1 什么是高可用 321
13.1.2 为什么需要高可用 322
13.1.3 稳定性与高可用 323
13.2 高可用设计原则 324
13.2.1 减少潜在风险的数量 324
13.2.2 减小故障的影响范围 324
13.2.3 缩短故障的影响时间 325
13.3 接入层高可用 326
13.3.1 负载均衡 326
13.3.2 Keepalived 327
13.3.3 ECMP 328
13.4 业务层高可用 329
13.4.1 无状态服务 329
13.4.2 集群部署 331
13.4.3 依赖处理 332
13.4.4 重试机制 333
13.4.5 幂等设计 334
13.4.6 服务降级 334
13.4.7 服务限流 335
13.4.8 监控预警 335
13.5 数据层高可用 336
13.5.1 副本机制 337
13.5.2 数据复制模式 337
13.5.3 利用Raft算法实现数据
复制 338
13.5.4 利用Raft算法实现故障
转移 345
13.5.5 数据分片 347
13.5.6 缓存高可用 348
第14章 服务端开发实用规范 349
14.1 实用API设计规范 349
14.1.1 明确边界 349
14.1.2 “命令,不要去询问”
原则 351
14.1.3 单一职责原则 353
14.1.4 不要基于实现设计API 355
14.1.5 异常模式或错误码模式 355
14.1.6 避免使用带有标识的
参数 357
14.1.7 API如其名 358
14.1.8 建立文档 358
14.1.9 统一风格 359
14.2 实用日志规范 359
14.2.1 基本规范 359
14.2.2 级别规范 360
14.2.3 格式规范 360
14.2.4 其他规范 361
14.3 实用异常处理规范 362
14.3.1 异常处理机制 362
14.3.2 常用处理规范 363
14.4 实用代码编写规范 364
14.4.1 大道至简 364
14.4.2 重复有度 365
14.4.3 快速失败原则 367
14.5 实用注释规范 369
14.5.1 复杂的逻辑 370
14.5.2 晦涩的算法 370
14.5.3 特殊的常量 371
14.5.4 非常规写法 371
14.5.5 对外API 372
14.5.6 法律文件 373
|
內容試閱:
|
【为什么要写这本书】
服务端开发涉及的面非常广,特别是在阿里、腾讯、字节跳动这类动辄十亿级用户、亿级 DAU(Daily Active User,日均活跃用户数)的头部企业的核心业务场景中,服务端开发充满挑战。然而,在校园中,相关学科的编程实践课程仍多停留在开发学生管理系统的水平上,与行业的实际需要脱节;在市面上,服务端开发相关的书籍大都聚焦于解读某种编程语言、中间件、开发框架或编程思想,缺乏互联网服务端开发实践内容和对服务端开发的体系化介绍。一系列因素导致服务端开发长期以来被误解为 Java 开发、Go 开发之类的“某编程语言开发”,或者被简单地定义为“编写运行于服务器的程序”。
2020 年,我在GitChat 和 CSDN上原创的技术博客突破一百万字,成为博客专家。码字科技创始人谢工建议我将博客专栏整理成书出版,并将我引荐给了机械工业出版社的杨福川老师。彼时,写一本全景式介绍服务端开发书籍的想法在我心头萌芽了。当我踌躇满志地准备大干一场的时候,我意识到一个严重的问题:服务端开发涉及的内容实在太多了,纷繁复杂的知识点令人望而生畏。几经思考,自认为没有足够的时间付之于此,于是我又退缩了。
时间来到 2021年年底,支付宝会员与公益技术部要对入职两年以内的服务端开发工程师进行技术培训,晏婴推荐我作为首门课程“大话系分设计”的讲师。接到这个任务,我不由得心头一紧。系分设计涵盖需求分析、抽象建模、系统设计、数据设计和非功能性设计等内容,实际上就是一幅服务端开发全景图。好在有将近一个月的时间准备,借此契机,我得以体系化地梳理服务端开发的知识脉络。
在之后的线下授课和交流中,我发现服务端开发工程师存在一些普遍性问题:其一,倾向于将产品文档“翻译”成代码,轻视业务,由于对业务领域全貌不了解,原本关键的抽象建模过程流于形式;其二,局限于围绕数据库开发,出手便是表结构设计,本末倒置;其三,在系统设计和开发中注重需求功能实现,对于高并发、高可用、高性能等非功能性问题考虑不足。考虑到短暂的线下培训难以将上述问题逐一讲透,我决定结合服务端开发的实际流程,编写一部开发指南。无心插柳柳成荫。随着编写工作的推进,写书的时机悄然成熟了。于是,我再次联系了杨福川老师,并在他的帮助下进一步完善了目录,最终确定了写作本书的计划。
自 2016 年起,我一直坚持通过写技术文章来分享知识,先后在 CSDN、GitChat、知乎、阿里技术公众号、阿里 ATA 等平台上发表了数百篇技术文章,其中部分文章还曾入选平台“年度最火文章合集”“年度好评 TOP10”和“头条推荐”。不过,这些文章像一个个分散的点,不成体系,对读者的帮助相对有限。鉴于此,我希望通过本书,全景式、体系化地为读者呈现服务端开发的方法和实用解决方案。
【读者对象】
IT 从业人员:服务端开发工程师、客户端开发工程师、产品经理、测试工程师等。
高校学生:计算机、自动化、电气、通信等专业的学生。
【本书特色】
在互联网领域,技术日新月异,以有限的精力持续学习十分困难。幸运的是,无论技术如何演进,其背后的方法论往往大同小异,经典解决方案历久弥新。因此,掌握方法论和实用解决方案尤为必要。不同于一般的技术书籍,本书不局限于任何一种具体的编程语言、框架、容器、中间件或编程思想,而是致力于全景式、体系化地解读服务端开发的流程、重点和难点。
本书分为技术与方法、解决方案两部分,理论结合实践。第一部分对需求分析、抽象建模、系统设计、数据设计和非功能性设计等服务端开发的核心环节进行了深入的解读,可以帮助读者快速、体系化地掌握服务端开发的相关知识。第二部分针对高并发、高可用、高性能、缓存、幂等、数据一致性等问题提供了行业经典解决方案,可以帮助读者夯实技术基础,提升竞争力。为了便于读者理解,本书还列举了大量案例,并绘制了200多张图,图文并茂。
【本书主要内容】
本书共 14 章,内容分为两部分。
第1部分包括第 1~6 章,主题是技术与方法。本部分首先介绍服务端开发的定义、职责、技术栈、核心流程和进阶路径,然后从需求分析、抽象建模、系统设计、数据设计、非功能性设计5个方面逐一展开,结合案例深入解读服务端开发的实操方法、重点和难点,为读者清晰呈现服务端开发的全景图。通过学习本部分内容,读者可以快速、体系化地掌握服务端开发的相关知识和方法。
第2部分包括第7~14 章,主题是解决方案。本部分针对高并发、高可用、高性能、缓存、幂等、数据一致性等服务端开发的典型问题,结合业务场景进行系统性分析并给出实战方案,并就接口设计、日志打印、异常处理、代码编写、代码注释等实施细节给出行业案例和规范。本部分内容如同一本服务端开发问题手册,可帮助读者解决实践中遇到的问题。
需要特别说明的是,第一部分内容不仅适合服务端开发人员学习,还适合前端开发、测试、产品经理、运营等岗位的人员学习,对提升技能、构建用例、设计产品和梳理需求大有裨益。第二部分内容所介绍的解决方案和开发规范均为行业实践经验的总结,部分知识点具有一定难度。如果你是一名经验较为丰富的工程师,可以直接阅读这部分内容;如果你从业不久或为在校学生,建议从第一部分的基础理论知识开始学习。
|
|