产品特色
编辑推荐
1、货真价实的互联网场景下大型网站架构演变过程中核心技术难题的解决方案;
2、全部来源于作者真实经历的生产案例,大型网站应对高并发、大流量的应急宝典;
3、分布式服务案例全面剖析,为大家讲解如何构建一个分布式调用跟踪系统;
4、大流量限流/消峰案例全面剖析,将流量尽可能挡在系统上游,避免对交易系统产生较大冲击;
5、分布式配置管理服务案例全面剖析,为大家讲解如何构建集中式资源配置中心;
6、限时抢购、秒杀场景下,热点数据的读/写优化案例;
7、数据库分库分表案例全面剖析,为大家讲解如何提升关系型数据库的并行处理能力和检索效率。
每一章都是重点,每一章都是解决方案
8、理论有,但你更需要的是技术难题的解决方案;
9、本书文字不枯燥、互联网味儿十足;
10、大型网站架构一定是简单和清晰的,而不是炫技般的复杂化,解决问题采用直接的方式直击要害才是至见效的;
11、从接入层到存储系统,本书涉及全面;
12、毫无保留地阐述了作者多年在互联网企业的架构设计经验;
13、一本从实战出发的经典作品;
14、不吹牛、不夸张,脚踏实地为你剖析架构如何落地。
内容简介
《人人都是架构师:分布式系统架构落地与瓶颈突破》并没有过多渲染系统架构的理论知识,而是切切实实站在开发一线角度,为各位读者诠释了大型网站在架构演变过程中出现一系列技术难题时的解决方案。《人人都是架构师:分布式系统架构落地与瓶颈突破》首先从分布式服务案例开始介绍,重点为大家讲解了大规模服务化场景下企业应该如何实施服务治理;然后在大流量限流/消峰案例中,笔者为大家讲解了应该如何有效地对流量实施管制,避免大流量对系统产生较大冲击,确保核心业务的稳定运行;接着笔者为大家讲解了分布式配置管理服务;之后的几章,笔者不仅为大家讲解了秒杀、限时抢购场景下热点数据的读/写优化案例,还为大家讲解了数据库实施分库分表改造后所带来的一系列影响的解决方案。
《人人都是架构师:分布式系统架构落地与瓶颈突破》适用于任何对分布式系统架构感兴趣的架构师、开发人员以及运维人员。相信阅读《人人都是架构师:分布式系统架构落地与瓶颈突破》你将会有知其然和知其所以然的畅快感。
作者简介
高翔龙,杭州云集微店架构师,基础架构组负责人,负责基础技术平台的架构设计和中间件研发等工作,技术书籍《Java虚拟机精讲》作者,热衷于开源技术,常年游走在Github上。
目录
第1章 分布式服务案例 1
1.1 分布式系统的架构演变过程 2
1.1.1 单机系统 3
1.1.2 集群架构 4
1.1.3 拆系统之业务垂直化 6
1.1.4 为什么需要实现服务化架构 8
1.1.5 服务拆分粒度之微服务 10
1.2 系统服务化需求 11
1.2.1 服务化与RPC协议 11
1.2.2 使用阿里分布式服务框架Dubbo实现服务化 12
1.2.3 警惕Dubbo因超时和重试引起的系统雪崩 16
1.2.4 服务治理方案 18
1.2.5 关于服务化后的分布式事务问题 20
1.3 分布式调用跟踪系统需求 21
1.3.1 Google的Dapper论文简介 22
1.3.2 基于Dubbo实现分布式调用跟踪系统方案 25
1.3.3 采样率方案 35
1.4 本章小结 37
第2章 大流量限流/消峰案例 38
2.1 分布式系统为什么需要进行流量管制 39
2.2 限流的具体方案 42
2.2.1 常见的限流算法 43
2.2.2 使用Google的Guava实现平均速率限流 45
2.2.3 使用Nginx实现接入层限流 48
2.2.4 使用计数器算法实现商品抢购限流 49
2.3 基于时间分片的消峰方案 51
2.3.1 活动分时段进行实现消峰 52
2.3.2 通过答题验证实现消峰 52
2.4 异步调用需求 53
2.4.1 使用MQ实现系统之间的解耦 54
2.4.2 使用Apache开源的ActiveMQ实现异步调用 55
2.4.3 使用阿里开源的RocketMQ实现互联网场景下的流量消峰 61
2.4.4 基于MQ方案实现流量消峰的一些典型案例 72
2.5 本章小结 75
第3章 分布式配置管理服务案例 76
3.1 本地配置 77
3.1.1 将配置信息耦合在业务代码中 77
3.1.2 将配置信息配置在配置文件中 79
3.2 集中式资源配置需求 82
3.2.1 分布式一致性协调服务ZooKeeper简介 83
3.2.2 ZooKeeper的下载与集群安装 84
3.2.3 ZooKeeper的基本使用技巧 86
3.2.4 基于ZooKeeper实现分布式配置管理平台方案 87
3.2.5 从配置中心获取Spring的Bean定义实现Bean动态注册 93
3.2.6 容灾方案 95
3.2.7 使用淘宝Diamond实现分布式配置管理服务 96
3.2.8 Diamond与ZooKeeper的细节差异 101
3.2.9 使用百度Disconf实现分布式配置管理服务 102
3.3 本章小结 110
第4章 大促场景下热点数据的读/写优化案例 111
4.1 缓存技术简介 112
4.1.1 使用Ehcache实现数据缓存 114
4.1.2 LocalCache存在的弊端 116
4.1.3 神秘的off-heap技术 117
4.2 高性能分布式缓存Redis简介 120
4.2.1 使用Jedis客户端操作Redis 121
4.2.2 使用Redis集群实现数据水平化存储 122
4.3 同一热卖商品高并发读需求 124
4.3.1 Redis集群多写多读方案 125
4.3.2 保障多写时的数据一致性 126
4.3.3 LocalCache结合Redis集群的多级Cache方案 128
4.3.4 实时热点自动发现方案 130
4.4 同一热卖商品高并发写需求 132
4.4.1 InnoDB行锁引起数据库TPS下降 132
4.4.2 在Redis中扣减热卖商品库存方案 134
4.4.3 热卖商品库存扣减优化方案 138
4.4.4 控制单机并发写流量方案 141
4.4.5 使用阿里开源的AliSQL数据库提升秒杀场景性能 142
4.5 本章小结 148
第5章 数据库分库分表案例 149
5.1 关系型数据库的架构演变 150
5.1.1 数据库读写分离 150
5.1.2 数据库垂直分库 151
5.1.3 数据库水平分库与水平分表 152
5.1.4 MySQL Sharding与MySQL Cluster的区别 153
5.2 Sharding中间件 154
5.2.1 常见的 Sharding中间件对比 155
5.2.2 Shark简介 156
5.2.3 Shark的架构模型 157
5.2.4 使用Shark实现分库分表后的数据路由任务 159
5.2.5 分库分表后所带来的影响 166
5.2.6 多机SequenceID解决方案 167
5.2.7 使用Solr满足多维度的复杂条件查询 170
5.2.8 关于分布式事务 172
5.3 数据库的HA方案 173
5.3.1 基于配置中心实现主从切换 174
5.3.2 基于Keepalived实现主从切换 176
5.3.3 保障主从切换过程中的数据一致性 179
5.4 订单业务冗余表需求 180
5.4.1 冗余表的实现方案 181
5.4.2 保障冗余表的数据一致性 183
5.5 本章小结 186
后记 187
前言/序言
本书的创作初衷
任何一本书,都是一个用于承载知识的载体,读者可以从中探寻自己想要知道的答案。对于我而言,书本就是带我领略奇妙计算机世界最快的一条途径。之所以想创作一本与大型分布式系统架构相关的书籍,是因为我在最近几年的实际工作中经历了太多的技术难题。每当我和我的团队尝试解决这些问题之前,时常想着能否从市面上现有的架构书籍中寻求到解决方案;但事与愿违,目前市面上高歌架构理论的读物居多,而真正讲解大型网站在架构演变过程中出现技术难题时应该如何解决的书籍却寥寥无几。对于这块领域的空白,我想尝试着去创作,尽量把我自己脑海中的内容写出来,让更多人受益,毕竟架构是需要落地的,否则便是一纸空谈。
本书内容重点
本书每一章的内容几乎都是独立的,大家完全可以挑选自己感兴趣或者有需要的部分进行阅读。本书一共包含5章,笔者首先从分布式服务案例开始讲起,将大家带进分布式系统的殿堂。在第1章中,笔者讲解了大型网站的架构演变过程,让大家对分布式系统建立一个基本的认识。当然,本章的重点是讲解企业在大规模服务化后应该如何实施服务治理,以及应该如何构建一个分布式调用跟踪系统,以一种可视化的方式来展现跟踪到的每一个请求的完整调用链,并收集调用链上每个服务的执行耗时,整合孤立日志等。
为了避免大促场景下峰值流量过大,对系统造成较大负载导致产生雪崩现象,笔者在本书的第2章为大家讲解了大流量限流/消峰案例,让系统的负载压力始终处于一个比较均衡的水位,从而保护系统的稳定运行。笔者首先从限流算法开始讲起,然后分享了业务层面和技术层面等两个维度的流量管制方案。当然,本章的重点是为大家演示如何通过MQ来实现大流量场景下的流量消峰。
本书的第3章为大家讲解了分布式配置管理服务案例(配置中心)。尽管目前一些中小型互联网企业仍然将本地配置作为首选,但是当网站发展到一定规模后,继续采用本地配置所暴露的问题将会越来越多。大型网站使用分布式配置管理平台不仅能够实现配置信息的集中式管理、降低维护成本和配置出错率,还能够动态获取/更新配置信息。本章的重点是为大家演示如何基于ZooKeeper构建一个分布式配置管理平台,以及使用淘宝Diamond和百度Disconf系统来实现分布式配置管理服务。
热点数据的读/写操作其实是秒杀、限时抢购场景下最核心的技术难题。在大促场景下,由于峰值流量较大,大量针对同一热卖商品的并发读/写操作一定会导致后端的存储系统产生性能瓶颈,因此第4章为大家讲解了大促场景下热点数据的读/写优化案例。尽管商品信息可以缓存在分布式缓存中,通过集群技术,可以在理论上认为其容量是无限的,但是对于大促场景下的热卖商品来说,由于单价比平时更给力、更具吸引力,因而自然会比平时吸引更大的流量进来;这时同一个Key必然会落到同一个缓存节点上,而分布式缓存在这种情况下一定会出现单点瓶颈,因此笔者为大家演示了如何实施多级Cache方案来防止分布式缓存系统出现单点瓶颈。由于写操作无法直接在缓存中完成,因此大量的并发更新热点数据(库存扣减)都是针对数据库中同一行的——本书以MySQL为例,而这必然会引起大量的线程来相互竞争InnoDB的行锁;并发越大时,等待的线程就越多,这会严重影响数据库的TPS,导致RT线性上升,最终可能引发系统出现雪崩。为了避免数据库沦为瓶颈,笔者为大家演示了如何通过分布式锁、乐观锁在分布式缓存系统中扣减库存、通过抢购限流控制单机并发写流量,以及如何使用阿里开源的AliSQL数据库提升“秒杀”场景性能。
在本书的最后一章,笔者为大家讲解了数据库分库分表案例。本章演示了如何通过分库分表中间件Shark来帮助企业实施分库分表改造,以及分库分表后所带来一系列影响的解决方案,并重点分享了笔者在实际工作中订单业务实施分库分表改造后,应该如何同时满足Buyer和Seller的多维度查询需求。
本书面向的读者
本书适用于任何对分布式系统架构感兴趣的架构师、开发人员以及运维人员。笔者尽量用通俗易懂的文字描绘本书的各个知识点,并引用了大量在实际工作中笔者遇到的那些真实案例,相信阅读本书时你将会有知其然并知其所以然的畅快感。
读者讨论
由于笔者能力有限,书中难免会出现一些错误或者不准确的地方,你可以通过邮箱gao_xianglong@sina.com将问题反馈给我,我会尽量对所有问题都给予答复。
致谢
首先我要感谢我们家莹宝宝,是你的支持和鼓励才让我有了继续创作下去的勇气。还记得在本书的创作过程中,每当我写完一节时,我都会“强迫”你高声朗读帮我梳理下笔的准确度;以及每当我头痛欲裂思绪全无时,你的陪伴点燃了我在每个凌晨的斗志;甚至在我烦躁时,你总是毫无怨言地忍受着我的“坏脾气”。谢谢你的包容和体贴,我爱你。
其次我要感谢我的团队:我的两位BOSS——冰冰和校长,最牛的MySQL DBA平哥,架构师大飞、青龙、小狼、僧哥、布爸,感谢你们平时在工作上的支持。
当然,本书能够顺利出版,离不开本书的两位编辑:孙学瑛老师和Anna老师的共同努力;感谢你们辛苦的文字校对工作,同时也祝愿孙学瑛老师家的猴宝宝健康茁壮地成长。
最后感谢那些曾经帮助过我的所有人,我爱你们!
高翔龙
2016年12月31日深夜
破壁而出,驾驭复杂:分布式系统实战精要 在信息洪流奔腾不息的今天,无论是蓬勃发展的互联网企业,还是力求转型的传统行业,都面临着同一个挑战:如何构建和维护能够支撑海量用户、海量数据、海量请求的可靠、高效、可扩展的系统?答案往往指向同一个方向——分布式系统。然而,分布式系统的设计与落地并非坦途,它伴随着网络延迟、数据一致性、节点失效、服务发现、容错与高可用等一系列棘手的问题。当系统规模达到一定程度,或者业务复杂度激增时,这些“分布式特有的痛点”便如同潜藏的暗礁,随时可能让辛勤构建的系统瞬间倾覆。 本书并非关于“人人都是架构师”这样宏大却略显虚泛的命题,也并非简单罗列市面上已有的分布式技术名词。它旨在深入一线,聚焦于分布式系统架构的落地实践与核心瓶颈的突破。我们从最本质的需求出发,剥离浮夸的技术概念,回归到分布式系统设计与实现中最具价值的环节。 核心读者对象: 一线开发工程师: 你是否在开发过程中,经常面对后端服务的性能瓶颈、并发处理难题,或是对复杂系统的维护感到力不从心?本书将为你揭示深层原因,并提供切实可行的解决方案。 系统架构师/技术负责人: 你是否正在设计新的分布式系统,或是需要对现有系统进行优化升级?本书将为你提供系统的思考框架和丰富的实战经验,帮助你规避常见陷阱,做出更明智的技术决策。 运维工程师: 你是否需要深刻理解系统的内部机制,以便更好地进行监控、故障排查与容量规划?本书将为你提供一套“知其然,更知其所以然”的视角。 对分布式系统充满好奇的技术爱好者: 如果你渴望理解现代大型软件系统为何能够如此稳定、高效地运转,并希望掌握构建这类系统的核心能力,本书将是你的理想选择。 本书内容梗概: 本书将系统性地梳理分布式系统设计的核心要素,并着重于落地过程中遇到的实际问题和突破方法。我们将深入探讨以下几个关键领域,每一个领域都紧密围绕着“落地”与“瓶颈突破”展开: 第一部分:分布式系统设计基石——挑战与应对 理解分布式系统的本质与挑战: 告别纸上谈兵,深入剖析分布式系统之所以复杂的原因——网络分区、延迟、异构性、并发访问、状态管理等。我们将以案例驱动,理解这些挑战如何在实际系统中演化。 CAP定理的实战解读与权衡: 并非仅仅是理论知识,本书将详细讲解CAP定理在不同业务场景下的实际应用。如何在一致性、可用性、分区容错性之间做出取舍?哪些场景可以牺牲一致性?如何利用最终一致性满足业务需求?我们将探讨各种策略。 数据一致性模型: 从强一致性到弱一致性,从顺序一致性到因果一致性,本书将逐一剖析这些模型。重点在于,在不同的分布式场景下,选择哪种一致性模型是成本效益最高、最符合业务要求的?如何通过技术手段(如版本控制、分布式事务)来近似或实现所需的一致性。 可靠性与可用性: 如何设计一个“不容易挂掉”的系统?我们将探讨各种容错机制,包括服务降级、熔断、限流、重试、幂等性设计等。如何通过冗余、备份、故障转移来提升系统的可用性,让用户感知不到服务的中断。 第二部分:核心组件与技术实践——落地篇 服务化与微服务架构: 从单体到 SOA 再到微服务,我们将剖析服务拆分的原则、挑战和最佳实践。如何合理定义服务边界?如何进行有效的服务间通信(RPC vs. REST,同步 vs. 异步)?服务治理(注册发现、配置中心)如何落地? 数据存储与管理: 关系型数据库的分布式实践: 分库分表是银弹吗?如何设计合理的 Sharding Key?如何处理跨分片事务?读写分离的应用与挑战。 NoSQL数据库的选型与应用: 键值存储、文档数据库、列族数据库、图数据库,在不同业务场景下的适用性与落地经验。如何应对NoSQL的数据一致性与事务难题。 分布式缓存: 缓存的策略(Cache-Aside, Read-Through, Write-Through, Write-Behind),如何设计失效策略,如何保证缓存与数据库的一致性,分布式缓存的集群管理与容错。 消息队列: 作为系统解耦、异步通信、削峰填谷的关键组件,我们将深入探讨消息队列的选型(Kafka, RabbitMQ, RocketMQ等)及其在实际应用中的配置、调优与故障处理。如何设计幂等的消费者?如何处理消息积压与重复消费? 分布式协调服务: ZooKeeper, etcd, Consul 等协调服务的核心功能(配置管理、服务发现、分布式锁、Leader 选举),以及它们在实际系统中的落地模式与最佳实践。 第三部分:性能瓶颈与优化策略——突破篇 性能瓶颈的识别与度量: 如何系统性地定位系统的性能瓶颈?性能分析的常用工具与方法。如何解读监控数据,发现潜在问题? 负载均衡策略: 从 L4 到 L7,从简单轮询到更智能的算法,如何选择合适的负载均衡策略来分配流量,提高系统吞吐量。 异步化与并发模型: 如何通过异步处理来提升系统响应速度?Reactor/Proactor 模式,Actor 模型,协程等并发编程模型的实践应用。 高吞吐量与低延迟设计: 针对大规模吞吐量场景,如何优化数据处理管道?如何减少网络往返次数?如何利用多线程、多进程、IO多路复用等技术。 故障排除与应急响应: 面对分布式系统的复杂故障,如何快速定位问题根源?有效的故障排查流程与思维。构建可观测性(Metrics, Logs, Traces)的重要性与实践。 第四部分:架构演进与未来趋势 领域驱动设计(DDD)在分布式系统中的应用: 如何通过 DDD 来划分微服务边界,管理复杂业务逻辑。 可观测性(Observability)实践: Metrics, Logging, Tracing 如何构建一套完整的可观测性体系,帮助我们理解和管理分布式系统。 Serverless 与云原生架构: Serverless 的优势与挑战,Kubernetes 在分布式系统中的应用,以及云原生对分布式系统设计的重塑。 面向未来的思考: 总结分布式系统设计的通用原则,对下一代分布式架构的展望。 本书的独特价值: 聚焦“落地”与“实战”: 我们避免了泛泛的技术介绍,而是深入到每个技术的落地细节、踩过的坑以及如何解决。 强调“瓶颈突破”: 每一章节都会针对分布式系统中常见的瓶颈,提供具体的分析方法和解决方案。 系统性与深度兼备: 并非零散的技术点拼凑,而是提供一套系统性的分布式系统设计与实战框架。 贴近工程实践: 借鉴大量真实项目中的经验和教训,力求内容具有高度的实用性。 在这本书中,我们将一起剥开分布式系统华丽外衣下的复杂肌理,用严谨的逻辑和丰富的实践经验,为你打开一扇通往高效、稳定、可扩展的分布式系统大门。无论你身处何种技术岗位,只要你致力于构建更强大的软件系统,本书都将是你不可或缺的参考。让我们一起,用技术的力量,驱动业务的增长,迎接更广阔的未来。