人人都是架構師:分布式系統架構落地與瓶頸突破
  • 推薦0
  • 收藏7
  • 瀏覽1.6K

人人都是架構師:分布式系統架構落地與瓶頸突破

高翔龍 (作者) 

  • 書  號:978-7-121-31238-0
  • 出版日期:2017-05-05
  • 頁  數:200
  • 開  本:16(185*235)
  • 出版狀態:上市銷售
本書注重大型網站技術架構方案的落地,以及實戰實施。本書不僅會從宏觀的角度去闡述大型電商網站系統的架構設計,更重要的是,會結合筆者實際的工作經驗,深入剖析大型電商系統最容易出現系統瓶頸的細節,并提供可實施方案。其中獨特內容有:利用mq的消峰;大秒系統redis cluster的單點瓶頸;關系型數據庫之sharding改造等。
真正的大型網站架構解決方案來了!
前言
本書的創作初衷
任何一本書,都是一個用于承載知識的載體,讀者可以從中探尋自己想要知道的答案。對于我而言,書本就是帶我領略奇妙計算機世界最快的一條途徑。之所以想創作一本與大型分布式系統架構相關的書籍,是因為我在最近幾年的實際工作中經歷了太多的技術難題。每當我和我的團隊嘗試解決這些問題之前,時常想著能否從市面上現有的架構書籍中尋求到解決方案;但事與愿違,目前市面上高歌架構理論的讀物居多,而真正講解大型網站在架構演變過程中出現技術難題時應該如何解決的書籍卻寥寥無幾。對于這塊領域的空白,我想嘗試著去創作,盡量把我自己腦海中的內容寫出來,讓更多人受益,畢竟架構是需要落地的,否則便是一紙空談。
本書內容重點
本書每一章的內容幾乎都是獨立的,大家完全可以挑選自己感興趣或者有需要的部分進行閱讀。本書一共包含5章,筆者首先從分布式服務案例開始講起,將大家帶進分布式系統的殿堂。在第1章中,筆者講解了大型網站的架構演變過程,讓大家對分布式系統建立一個基本的認識。當然,本章的重點是講解企業在大規模服務化后應該如何實施服務治理,以及應該如何構建一個分布式調用跟蹤系統,以一種可視化的方式來展現跟蹤到的每一個請求的完整調用鏈,并收集調用鏈上每個服務的執行耗時,整合孤立日志等。
為了避免大促場景下峰值流量過大,對系統造成較大負載導致產生雪崩現象,筆者在本書的第2章為大家講解了大流量限流/消峰案例,讓系統的負載壓力始終處于一個比較均衡的水位,從而保護系統的穩定運行。筆者首先從限流算法開始講起,然后分享了業務層面和技術層面等兩個維度的流量管制方案。當然,本章的重點是為大家演示如何通過MQ來實現大流量場景下的流量消峰。
本書的第3章為大家講解了分布式配置管理服務案例(配置中心)。盡管目前一些中小型互聯網企業仍然將本地配置作為首選,但是當網站發展到一定規模后,繼續采用本地配置所暴露的問題將會越來越多。大型網站使用分布式配置管理平臺不僅能夠實現配置信息的集中式管理、降低維護成本和配置出錯率,還能夠動態獲取/更新配置信息。本章的重點是為大家演示如何基于ZooKeeper構建一個分布式配置管理平臺,以及使用淘寶Diamond和百度Disconf系統來實現分布式配置管理服務。
熱點數據的讀/寫操作其實是秒殺、限時搶購場景下最核心的技術難題。在大促場景下,由于峰值流量較大,大量針對同一熱賣商品的并發讀/寫操作一定會導致后端的存儲系統產生性能瓶頸,因此第4章為大家講解了大促場景下熱點數據的讀/寫優化案例。盡管商品信息可以緩存在分布式緩存中,通過集群技術,可以在理論上認為其容量是無限的,但是對于大促場景下的熱賣商品來說,由于單價比平時更給力、更具吸引力,因而自然會比平時吸引更大的流量進來;這時同一個Key必然會落到同一個緩存節點上,而分布式緩存在這種情況下一定會出現單點瓶頸,因此筆者為大家演示了如何實施多級Cache方案來防止分布式緩存系統出現單點瓶頸。由于寫操作無法直接在緩存中完成,因此大量的并發更新熱點數據(庫存扣減)都是針對數據庫中同一行的——本書以MySQL為例,而這必然會引起大量的線程來相互競爭InnoDB的行鎖;并發越大時,等待的線程就越多,這會嚴重影響數據庫的TPS,導致RT線性上升,最終可能引發系統出現雪崩。為了避免數據庫淪為瓶頸,筆者為大家演示了如何通過分布式鎖、樂觀鎖在分布式緩存系統中扣減庫存、通過搶購限流控制單機并發寫流量,以及如何使用阿里開源的AliSQL數據庫提升“秒殺”場景性能。
在本書的最后一章,筆者為大家講解了數據庫分庫分表案例。本章演示了如何通過分庫分表中間件Shark來幫助企業實施分庫分表改造,以及分庫分表后所帶來一系列影響的解決方案,并重點分享了筆者在實際工作中訂單業務實施分庫分表改造后,應該如何同時滿足Buyer和Seller的多維度查詢需求。
本書面向的讀者
本書適用于任何對分布式系統架構感興趣的架構師、開發人員以及運維人員。筆者盡量用通俗易懂的文字描繪本書的各個知識點,并引用了大量在實際工作中筆者遇到的那些真實案例,相信閱讀本書時你將會有知其然并知其所以然的暢快感。
讀者討論
由于筆者能力有限,書中難免會出現一些錯誤或者不準確的地方,你可以通過郵箱[email protected]將問題反饋給我,我會盡量對所有問題都給予答復。
致謝
首先我要感謝我們家瑩寶寶,是你的支持和鼓勵才讓我有了繼續創作下去的勇氣。還記得在本書的創作過程中,每當我寫完一節時,我都會“強迫”你高聲朗讀幫我梳理下筆的準確度;以及每當我頭痛欲裂思緒全無時,你的陪伴點燃了我在每個凌晨的斗志;甚至在我煩躁時,你總是毫無怨言地忍受著我的“壞脾氣”。謝謝你的包容和體貼,我愛你。
其次我要感謝我的團隊:我的兩位BOSS——冰冰和校長,最牛的MySQL DBA平哥,架構師大飛、青龍、小狼、僧哥、布爸,感謝你們平時在工作上的支持。
當然,本書能夠順利出版,離不開本書的兩位編輯:孫學瑛老師和Anna老師的共同努力;感謝你們辛苦的文字校對工作,同時也祝愿孫學瑛老師家的猴寶寶健康茁壯地成長。
最后感謝那些曾經幫助過我的所有人,我愛你們!
高翔龍
2016年12月31日深夜

目錄

第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

讀者評論

  • 4.4.2節中,請問一下,既然redis是單線程的架構,使用decr判斷返回值的方式就可以避免超賣了,為什么還需要使用分布式鎖?

    jokerChendi發表于 2018/5/9 0:19:12
  • 您好,請問,第五章講的分庫為什么不在框架上做?記得也有mybatis-shard之類的東東啊,謝謝

    ycd發表于 2017/10/26 7:03:16

相關圖書

趣談網絡協議

鐘韻 (作者)

網絡協議是每個程序員入門的必修課,但是完全掌握網絡協議知識并進行實際應用卻并非易事。在本書中,作者將結合自己從業多年的“泣血”經驗,以通俗易懂、更加貼近日常生活...

¥108.00

大型系統應用架構實戰:部署、容災、性能優化

李彥超 郭東白 陳禹 謝松林 周志偉 桑植 (作者)

本書理論與實戰相結合,以AliExpress 網站為基礎,全面介紹大型系統的總體技術方案、全球區域化部署技術、全球網絡調度技術、性能優化,以及SRE 在AliE...

 

Java微服務測試:基于Arquillian、Hoverfly、AssertJ、JUnit、Selenium與Mockito

Alex Soto Bueno, Jason Porter, Andy Gumbrecht (作者) 劉夢馨 (譯者)

本書從實戰出發,介紹微服務架構所帶來的測試方面的挑戰,以及如何利用新的技術來應對這些挑戰。通過本書,讀者可以學會如何編寫微服務架構下的單元測試、組件測試、集成測...

¥89.00

深入理解Apache Dubbo與實戰

詣極 林琳 (作者)

本書首先介紹Dubbo的簡史、后續的規劃和整體架構大圖;接著介紹Dubbo環境配置,并基于Dubbo開發第一款應用程序;然后介紹Dubbo內置的常用注冊中心的實...

¥79.00

小團隊構建大網站:中小研發團隊架構實踐

張輝清 楊麗 (作者)

本書結合作者近幾年的工作經驗,總結了一套可直接落地、基于開源、成本低、可快速搭建的中小研發團隊架構實踐方法。本書共5篇22章,開篇是本書的導讀;架構篇是設計思想...

¥69.00

區塊鏈2.0(第2版)

譚磊 (作者)

當人們談論“區塊鏈”的時候,上下文往往是“比特幣”或者其他某種虛擬貨幣。而實際上區塊鏈的應用遠不止于此。本書不僅會為讀者解釋什么是區塊鏈,更重要的是介紹區塊鏈技...

¥49.00
澳洲幸运10现场开奖