当我在撰写本书时,脑海中曾浮现出当初上学期间一个劲儿地啃UML建模、软件架构设计书籍的情景。对于一个没有太多项目经验的人来说有点可笑,但也正是这种过早熏陶,使得我之后在工作中接手一个个项目时,会多想一些架构方面的事情。
为什么说是多想了呢?因为无论在企业面试还是日常工作中,人们更多谈论的是语言、数据结构、算法、操作系统原理,框架或中间件的使用方式、原理等硬性的内容,因为这些硬性的内容比较容易表述,其中学问的深浅也容易衡量。而对于软件建模、架构设计等软性的内容,就不容易衡量了。人们都知道它们很重要,但又说不清楚里面到底包含了哪些学问,所以谈论这些内容时通常都比较虚,最终导致很少从方法论的角度去讲,而是在项目中遇到问题时再具体解决,属于实用主义思维的做法。
另一方面,随着互联网技术的发展,很多大型网站或系统要处理海量的用户访问,需要解决高并发、高可用和由此带来的数据一致性问题,这也使得大家把大部分精力都用在解决这些问题上。这些问题可以被称为显性问题,因为如果解决不好,会造成系统宕机,用户体验受损,给企业带来严重损失,人们能意识到这种问题很重要。解决的思路通常有两个:第一,利用分布式系统的特性不断地分拆,把大系统拆小,各个击破,降低风险;第二,小步快跑,快速迭代。
但还有一类问题是隐性问题,是指系统的可重用性、可扩展性、可维护性等。因为一个系统由于设计问题导致研发人力的投入和时间成本的增加,往往无法显性地衡量。也可能并非系统设计得不好,而是业务本身就很复杂,或者各部门之间的沟通协调问题导致开发效率低。即便系统设计得不好,做新功能有沉重的历史包袱,也能依靠加班加点解决。但其实隐性问题比显性问题的影响更大,因为它会让技术拖累业务,当有新需求的时候,系统无法跟随业务快速变化。
所以,本书不想偏废两者中的任意一个。因为对于一个系统来说,可能既面临高并发、高可用的技术问题,又面临复杂的业务问题,所以如何处理两者的关系,打通技术和业务的任督二脉,是本书想要探讨的内容。
架构是一种综合能力,而不是某一方面的技能。也正因为如此,本书提供的是一个全面的解决方案、方法论、成体系的设计思维。本书从基础技术谈起,之后到高层技术,再到业务、管理,提供一个架构能力的全局视图,从而诠释一个架构师的完整能力模型。
具体来说,全书分为5大部分:
第1部分:从行业背景出发,对架构做一个宏观概述,阐述架构是什么。
第2部分:计算机功底。功底非常重要,这是做架构的基本门槛。大学的教科书上教的全是功底,但经过多年实践之后,再回过头看书本内容,会有新的理解和体会。
第3部分:技术架构。这部分是纯技术,讲解如何应对高并发、高可用、一致性方面的问题。
第4部分:业务架构。如何从技术延展到业务,如何跳出技术细节抽象思考问题,如何通过业务建模把技术和业务进行融合。
第5部分:从职业发展的角度,从技术延展到管理。建立对公司、商业、团队管理的一些认知。
对于刚入行的新人,建议从头看到尾,从而对架构的能力体系有一个全面的认知;对于有经验的从业者,可以选取自己感兴趣的章节阅读。
由于编写时间紧张,书中难免存在不足之处,望广大读者批评指正。
目 录
第1部分 什么是架构
第1章 五花八门的架构师职业2
1.1 架构师职业分类2
1.2 架构的分类2
第2章 架构的道与术5
2.1 何为道,何为术5
2.2 道与术的辩证关系6
第2部分 计算机功底
第3章 语言10
3.1 层出不穷的编程语言10
3.2 精通一门语言10
第4章 操作系统12
4.1 缓冲I/O和直接I/O12
4.2 内存映射文件与零拷贝14
4.2.1 内存映射文件14
4.2.2 零拷贝15
4.3 网络I/O模型17
4.3.1 实现层面的网络I/O模型17
4.3.2 Reactor模式与Preactor模式20
4.3.3 select、epoll的LT与ET20
4.3.4 服务器编程的1 N M模型22
4.4 进程、线程和协程24
4.5 无锁(内存屏障与CAS)27
4.5.1 内存屏障27
4.5.2 CAS30
第5章 网络31
5.1 HTTP 1.031
5.1.1 HTTP 1.0的问题31
5.1.2 Keep-Alive机制与Content-Length属性31
5.2 HTTP 1.132
5.2.1 连接复用与Chunk机制32
5.2.2 Pipeline与Head-of-line Blocking问题33
5.2.3 HTTP/2出现之前的性能提升方法34
5.2.4 一来多回问题35
5.2.5 断点续传36
5.3 HTTP/236
5.3.1 与HTTP 1.1的兼容37
5.3.2 二进制分帧37
5.3.3 头部压缩39
5.4 SSL/TLS39
5.4.1 背景39
5.4.2 对称加密的问题40
5.4.3 双向非对称加密41
5.4.4 单向非对称加密42
5.4.5 中间人攻击43
5.4.6 数字证书与证书认证中心44
5.4.7 根证书与CA信任链45
5.4.8 SSL/TLS协议:四次握手47
5.5 HTTPS48
5.6 TCP/UDP49
5.6.1 可靠与不可靠49
5.6.2 TCP的假连接(状态机)51
5.6.3 三次握手(网络2将军问题)53
5.6.4 四次挥手54
5.7 QUIC56
5.7.1 不丢包(Raid5算法和Raid6算法)57
5.7.2 更少的RTT58
5.7.3 连接迁移58
第6章 数据库59
6.1 范式与反范式59
6.2 分库分表59
6.2.1 为什么要分60
6.2.2 分布式ID生成服务60
6.2.3 拆分维度的选择60
6.2.4 Join查询问题61
6.2.5 分布式事务61
6.3 B 树62
6.3.1 B 树逻辑结构62
6.3.2 B 树物理结构63
6.3.3 非主键索引65
6.4 事务与锁66
6.4.1 事务的四个隔离级别66
6.4.2 悲观锁和乐观锁67
6.4.3 死锁检测71
6.5 事务实现原理之1:Redo Log72
6.5.1 Write-Ahead73
6.5.2 Redo Log的逻辑与物理结构74
6.5.3 Physiological Logging75
6.5.4 I/O写入的原子性(Double Write)76
6.5.5 Redo Log Block结构77
6.5.6 事务、LSN与Log Block的关系78
6.5.7 事务Rollback与崩溃恢复(ARIES算法)80
6.6 事务实现原理之2:Undo Log86
6.6.1 Undo Log是否一定需要86
6.6.2 Undo Log(MVCC)88
6.6.3 Undo Log不是Log89
6.6.4 Undo Log与Redo Log的关联90
6.6.4 各种锁91
6.7 Binlog与主从复制94
6.7.1 Binlog与Redo Log的主要差异94
6.7.2 内部XA ?C Binlog与Redo Log一致性问题95
6.7.3 三种主从复制方式96
6.7.3 并行复制97
第7章 框架、软件与中间件99
7.1 对生态体系的认知99
7.2 框架99
7.3 软件与中间件100
第3部分 技术架构之道
第8章 高并发问题104
8.1 问题分类104
8.1.1 侧重于高并发读的系统104
8.1.2 侧重于高并发写的系统105
8.1.3 同时侧重于高并发读和高并发写的系统106
8.2 高并发读108
8.2.1 策略1:加缓存108
8.2.2 策略2:并发读109
8.2.3 策略3:重写轻读110
8.2.4 总结:读写分离(CQRS架构)113
8.3 高并发写114
8.3.1 策略1:数据分片114
8.3.2 策略2:任务分片115
8.3.3 策略3:异步化117
8.3.4 策略4:批量123
8.3.5 策略5:串行化 多进程单线程 异步I/O124
8.4 容量规划125
8.4.1 吞吐量、响应时间与并发数125
8.4.2 压力测试与容量评估127
第9章 高可用与稳定性129
9.1 多副本129
9.2 隔离、限流、熔断和降级130
9.3 灰度发布与回滚135
9.4 监控体系与日志报警136
第10章 事务一致性138
10.1 随处可见的分布式事务问题138
10.2 分布式事务解决方案汇总139
10.2.1 2PC139
10.2.2 最终一致性(消息中间件)141
10.2.3 TCC145
10.2.4 事务状态表 调用方重试 接收方幂等147
10.2.5 对账148
10.2.6 妥协方案:弱一致性 基于状态的补偿149
10.2.7 妥协方案:重试 回滚 报警 人工修复151
10.2.8 总结152
第11章 多副本一致性153
11.1 高可用且强一致性到底有多难153
11.1.1 Kafka的消息丢失问题153
11.1.2 Kafka消息错乱问题156
11.2 Paxos算法解析158
11.2.1 Paxos解决什么问题158
11.2.2 复制状态机161
11.2.3 一个朴素而深刻的思想163
11.2.4 Basic Paxos算法164
11.2.5 Multi Paxos算法167
11.3 Raft算法解析169
11.3.1 为可理解性而设计169
11.3.2 单点写入170
11.3.3 日志结构171
11.3.4 阶段1:Leader选举174
11.3.5 阶段2:日志复制176
11.3.6 阶段3:恢复阶段177
11.3.7 安全性保证177
11.4 Zab算法解析180
11.4.1 Replicated State Machine vs. Primary-Backup System180
11.4.2 zxid182
11.4.3 序:乱序提交 vs. 顺序提交182
11.4.4 Leader选举:FLE算法184
11.4.5 正常阶段:2阶段提交186
11.4.6 恢复阶段186
11.5 三种算法对比187
第12章 CAP理论189
12.1 CAP理论的误解189
12.2 现实世界不存在强一致性(PACELC理论)190
12.3 典型案例:分布式锁192
第4部分 业务架构之道
第13章 业务意识196
13.1 产品经理vs.需求分析师196
13.2 什么叫作一个业务198
13.3 业务架构的双重含义199
13.4 业务架构与技术架构的区分200
第14章 业务架构思维202
14.1 伪分层202
14.2 边界思维204
14.3 系统化思维205
14.4 利益相关者分析206
14.5 非功能性需求分析(以终为始)208
14.6 视角(横看成岭侧成峰)209
14.7 抽象210
14.8 建模213
14.9 正交分解215
第15章 技术架构与业务架构的融合218
15.1 各式各样的方法论218
15.2 为什么要领域驱动218
15.3 业务流程不等于系统流程221
15.4 为何很难设计一个好的领域模型222
15.5 领域驱动设计与微服务架构的合223
15.6 领域驱动设计与读写分离(CQRS)224
15.7 业务分层架构模式225
15.8 管道过滤器架构模式226
15.9 状态机架构模式226
15.10 业务切面/业务闭环架构模式228
第5部分 从架构到技术管理
第16章 个人素质的提升232
16.1 能力模型232
16.2 影响力的塑造234
第17章 团队能力的提升237
17.1 不确定性与风险把控237
17.2 以价值为中心的管理239
17.3 团队培养241