産品特色
編輯推薦
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 在分布式係統中的應用,以及雲原生對分布式係統設計的重塑。 麵嚮未來的思考: 總結分布式係統設計的通用原則,對下一代分布式架構的展望。 本書的獨特價值: 聚焦“落地”與“實戰”: 我們避免瞭泛泛的技術介紹,而是深入到每個技術的落地細節、踩過的坑以及如何解決。 強調“瓶頸突破”: 每一章節都會針對分布式係統中常見的瓶頸,提供具體的分析方法和解決方案。 係統性與深度兼備: 並非零散的技術點拼湊,而是提供一套係統性的分布式係統設計與實戰框架。 貼近工程實踐: 藉鑒大量真實項目中的經驗和教訓,力求內容具有高度的實用性。 在這本書中,我們將一起剝開分布式係統華麗外衣下的復雜肌理,用嚴謹的邏輯和豐富的實踐經驗,為你打開一扇通往高效、穩定、可擴展的分布式係統大門。無論你身處何種技術崗位,隻要你緻力於構建更強大的軟件係統,本書都將是你不可或缺的參考。讓我們一起,用技術的力量,驅動業務的增長,迎接更廣闊的未來。