分佈式架構工程設計

要學好分佈式架構,你首先需要學習一些架構指導性的文章和方法論,即分佈式架構設計原則。下面是幾篇很不錯的文章,值得一讀。
Designs, Lessons and Advice from Building Large Distributed Systems,Google 傑夫·迪恩(Jeff Dean)2009 年一次演講的 PPT。2010 年,斯坦福大學請傑夫·迪恩到大學裏給他們講了一節課,你可以在 YouTube 上看一下,Building Software Systems At Google and Lessons Learned ,其回顧了 Google 發展的歷史。
The Twelve-Factor App ,如今,軟件通常會作爲一種服務來交付,它們被稱爲網絡應用程序,或軟件即服務(SaaS)。12-Factor 爲構建 SaaS 應用提供了方法論,是架構師必讀的文章。(中譯版)這篇文章在業內的影響力很大,必讀!
Notes on Distributed Systems for Young Bloods ,給準備進入分佈式系統領域的人的一些忠告。
On Designing and Deploying Internet-Scale Services中譯版),微軟 Windows Live 服務平臺的一些經驗性的總結文章,很值得一讀。
4 Things to Keep in Mind When Building a Platform for the Enterprise ,Box 平臺 VP 海蒂·威廉姆斯(Heidi Williams)撰寫的一篇文章,闡述了爲企業構建平臺時需要牢記的四件關於軟件設計方面的事:1. Design Broadly, Build Narrowly; 2. Platforms Are Powerful and Flexible. Choose wisely what to expose when!;3. Build Incrementally, Get Feedback, and Iterate;4. Create a Platform-first Mentality。文章中有詳細的解讀,推薦看看。
Principles of Chaos Engineering ,我們知道,Netflix 公司有一個叫 Chaos Monkey 的東西,這個東西會到分佈式系統裏“瞎搞”,以此來測試系統的健壯和穩定性。這個視頻中,Netflix 分享了一些軟件架構的經驗和原則,值得一看。
Building Fast & Resilient Web Applications ,伊利亞·格里高利克(Ilya Grigorik)在 Google I/O 2016 上的一次關於如何通過彈力設計來實現快速和可容錯的網站架構的演講,其中有好些經驗分享。
Design for Resiliency ,這篇文章帶我們全面認識“彈力(Resiliency)”,以及彈力對於系統的重要性,並詳細闡述瞭如何設計和實現系統的彈力。
微軟的 Azure 網站上有一系列的 Design Principle 的文章,你可以看看這幾篇: Design for Self-healingDesign for Scaling OutDesign for Evolution
Eventually Consistent ,AWS CTO 維爾納·沃格爾斯(Werner Vogels)發佈在自己 Blog 上的一篇關於最終一致性的好文。
Writing Code that Scales ,Rackspace 的一篇很不錯的博文,告訴我們一些很不錯的寫出高擴展和高性能代碼的工程原則。
Automate and Abstract: Lessons from Facebook on Engineering for Scale ,軟件自動化和軟件抽象,這是軟件工程中最重要的兩件事了。通過這篇文章,我們可以看到 Facebook 的關於這方面的一些經驗教訓。

設計模式

有了方法論後,你還需要學習一些比較細節的落地的技術。最好的方式就是學習被前人總結出來的設計模式,雖然設計模式也要分場景,但是設計模式可以讓你知道一些套路,這些套路對於我們設計的分佈式系統有非常大的幫助,不但可以讓我們少走一些彎路,而且還能讓我們更爲系統和健壯地設計我們的架構。
下面是一些分佈式架構設計模式的網站。
首先,需要重點推薦的是微軟雲平臺 Azure 上的設計模式。 Cloud Design Patterns ,這個網站上羅列了分佈式設計的各種設計模式,可以說是非常全面和完整。對於每一個模式都有詳細的說明,並有對其優缺點的討論,以及適用場景和不適用場景的說明,實在是一個非常不錯的學習分佈式設計模式的地方。其中有如下分類。
除此之外,還有其它的一些關於分佈式系統設計模式的網站和相關資料。
AWS Cloud Pattern ,這裏收集了 AWS 雲平臺的一些設計模式。
Design patterns for container-based distributed systems ,這是 Google 給的一篇論文,其中描述了容器化下的分佈式架構的設計模式。
Patterns for distributed systems ,這是一個 PPT,其中講了一些分佈式系統的架構模式,你可以順着到 Google 裏去搜索。
我個人覺得微服務也好,SOA 也好,都是分佈式系統的一部分,這裏有兩個網站羅列了各種各樣的服務架構模式。
當然,還有我在極客時間上寫的那些分佈式的設計模式的總結。
彈力設計篇,內容包括:認識故障和彈力設計、隔離設計、異步通訊設計、冪等性設計、服務的狀態、補償事務、重試設計、熔斷設計、限流設計、降級設計、彈力設計總結。
管理設計篇,內容包括:分佈式鎖、配置中心、邊車模式、服務網格、網關模式、部署升級策略等。
性能設計篇,內容包括:緩存、異步處理、數據庫擴展、秒殺、邊緣計算等。

設計與工程實踐

分佈式系統的故障測試

FIT: Failure Injection Testing ,Netflix 公司的一篇關於做故障注入測試的文章。
Automated Failure Testing ,同樣來自 Netflix 公司的自動化故障測試的一篇博文。
Automating Failure Testing Research at Internet Scale ,Netflix 公司夥同聖克魯斯加利福尼亞大學和 Gremlin 遊戲公司一同撰寫的一篇論文。

彈性伸縮

4 Architecture Issues When Scaling Web Applications: Bottlenecks, Database, CPU, IO ,本文講解了後端程序的主要性能指標,即響應時間和可伸縮性這兩者如何能提高的解決方案,討論了包括縱向和橫向擴展,可伸縮架構、負載均衡、數據庫的伸縮、CPU 密集型和 I/O 密集型程序的考量等。
Scaling Stateful Objects ,這是一本叫《Development&Deployment of Multiplayer Online Games》書中一章內容的節選,討論了有狀態和無狀態的節點如何伸縮的問題。雖然還沒有寫完,但是可以給你一些很不錯的基本概念和想法。
Scale Up vs Scale Out: Hidden Costs ,Coding Horror 上的一篇有趣的文章,詳細分析了可伸縮性架構的不同擴展方案(橫向擴展或縱向擴展)所帶來的成本差異,幫助你更好地選擇合理的擴展方案,可以看看。
Best Practices for Scaling Out ,OpenShift 的一篇討論 Scale out 最佳實踐的文章。
Scalability Worst Practices ,這篇文章討論了一些最差實踐,你需要小心避免。
Reddit: Lessons Learned From Mistakes Made Scaling To 1 Billion Pageviews A Month ,Reddit 分享的一些關於系統擴展的經驗教訓。
下面是幾篇關於自動化彈性伸縮的文章。

一致性哈希

Consistent Hashing ,這是一個一致性哈希的簡單教程,其中還有代碼示例。
Consistent Hashing: Algorithmic Tradeoffs ,這篇文章講述了一致性哈希的一些缺陷和坑,以及各種哈希算法的性能比較,最後還給了一組代碼倉庫,其中有各種哈希算法的實現。
Distributing Content to Open Connect ,Netflix 的一個對一致性哈希的實踐,提出了 Uniform Consistent Hashing,是挺有意思的一篇文章。
Consistent Hashing in Cassandra ,這是 Cassandra 中使用到的一致性哈希的相關設計。

數據庫分佈式

Life Beyond Distributed Transactions ,該文是 Salesforce 的軟件架構師帕特·赫蘭德(Pat Helland)於 2016 年 12 月發表的針對其在 2007 年 CIDR(創新數據庫研究會議)上首次發表的同名文章的更新和縮寫版本。業界談到分佈式事務通常指兩段提交 2PC 事務(Spring/JEE 中 JTA 等) 或者 Paxos 與 Raft,這些事務都有明顯缺點和侷限性。
而赫蘭德在本文討論的是另外一種基於本地事務情況下的事務機制,它是基於實體和活動(Activity)的概念,其實類似 DDD 聚合根和領域事件的概念,這種工作流類型事務雖然需要程序員介入,依靠消息系統實現,但可以實現接近無限擴展的大型系統。赫蘭德文中提出了重要的觀點:“如果你不能使用分佈式事務,那麼你就只能使用工作流。”
How Sharding Works ,這是一篇很不錯的探討數據 Sharding 的文章。基本上來說,數據 Sharding 可能的問題都在這篇文章裏談到了。
Why you don’t want to shard ,這是 Percona 的一篇文章,其中表達了,不到萬不得已不要做數據庫分片。是的,最好還是先按業務來拆分,先把做成微服務的架構,然後把數據集變簡單,然後再做 Sharding 會更好。
How to Scale Big Data Applications ,這也是 Percona 給出的一篇關於怎樣給大數據應用做架構擴展的文章。值得一讀。
MySQL Sharding with ProxySQL ,用 ProxySQL 來支撐 MySQL 數據分片的一篇實踐文章。

緩存

緩存更新的套路,這是我在 CoolShell 上寫的緩存更新的幾個設計模式,包括 Cache Aside、Read/Write Through、Write Behind Caching。
Design Of A Modern Cache ,設計一個現代化的緩存系統需要注意到的東西。
Netflix: Caching for a Global Netflix ,Netflix 公司的全局緩存架構實踐。
Facebook: An analysis of Facebook photo caching ,Facebook 公司的圖片緩存使用分析,這篇文章挺有意思的,用數據來調優不同的緩存大小和算法。
How trivago Reduced Memcached Memory Usage by 50% ,Trivago 公司一篇分享自己是如何把 Memcached 的內存使用率降了一半的實踐性文章。很有意思,可以讓你學到很多東西。
Caching Internal Service Calls at Yelp ,Yelp 公司的緩存系統架構。

消息隊列

Understanding When to use RabbitMQ or Apache Kafka ,什麼時候使用 RabbitMQ,什麼時候使用 Kafka,通過這篇文章可以讓你明白如何做技術決策。
LinkedIn: Running Kafka At Scale ,LinkedIn 公司的 Kafka 架構擴展實踐。
Should You Put Several Event Types in the Same Kafka Topic? ,這個問題可能經常困擾你,這篇文章可以爲你找到答案。
Billions of Messages a Day - Yelp’s Real-time Data Pipeline ,Yelp 公司每天十億級實時消息的架構。
Uber: Introducing Chaperone: How Uber Engineering Audits Kafka End-to-End ,Uber 公司對 Kafka 消息的端到端審計。
Publishing with Apache Kafka at The New York Times ,紐約時報的 Kafka 工程實踐。
Kafka Streams on Heroku ,Heroku 公司的 Kafka Streams 實踐。
Exactly-once Semantics are Possible: Here’s How Kafka Does it ,怎樣用 Kafka 讓只發送一次的語義變爲可能。這是業界中一個很難的工程問題。
Delivering billions of messages exactly once 同上,這也是一篇挑戰消息只發送一次這個技術難題的文章。
Benchmarking Streaming Computation Engines at Yahoo!。Yahoo! 的 Storm 團隊在爲他們的流式計算做技術選型時,發現市面上缺乏針對不同計算平臺的性能基準測試。於是,他們研究並設計了一種方案來做基準測試,測試了 Apache Flink、Apache Storm 和 Apache Spark 這三種平臺。文中給出了結論和具體的測試方案。(如果原文鏈接不可用,請嘗試搜索引擎對該網頁的快照。)

關於日誌方面

Using Logs to Build a Solid Data Infrastructure - Martin Kleppmann ,設計基於 log 結構應用架構的一篇不錯的文章。
Building DistributedLog: High-performance replicated log service ,Distributed 是 Twitter 2016 年 5 月份開源的一個分佈式日誌系統。在 Twitter 內部已經使用 2 年多。其主頁在 distributedlog.io。這篇文章講述了這個高性能日誌系統的一些技術細節。另外,其技術負責人是個中國人,其在微信公衆號中也分享過這個系統 Twitter 高性能分佈式日誌系統架構解析
LogDevice: a distributed data store for logs ,Facebook 分佈式日誌系統方面的一些工程分享。

關於性能方面

Understand Latency ,這篇文章收集並整理了一些和系統響應時間相關的文章,可以讓你全面瞭解和 Latency 有關的系統架構和設計經驗方面的知識。
Common Bottlenecks ,文中講述了 20 個常見的系統瓶頸。
Performance is a Feature ,Coding Horror 上的一篇讓你關注性能的文章。
Make Performance Part of Your Workflow ,這篇文章是圖書《Designing for Performance》中的節選(國內沒有賣的),其中給出來了一些和性能有關的設計上的平衡和美學。
CloudFlare: How we built rate limiting capable of scaling to millions of domains,講述了 CloudFlare 公司是怎樣實現他們的限流功能的。從最簡單的每客戶 IP 限流開始分析,進一步講到 anycast,在這種情況下 PoP 的分佈式限流是怎樣實現的,並詳細解釋了具體的算法。

關於搜索方面

各公司的架構實踐

High Scalability ,這個網站會定期分享一些大規模系統架構是怎樣構建的,下面是迄今爲止各個公司的架構說明。

小結

今天我們分享的內容是高手成長篇分佈式架構部分的最後一篇——分佈式架構工程設計,講述了設計原則、設計模式等方面的內容,尤其整理和推薦了國內外知名企業的設計思路和工程實踐,十分具有借鑑意義。
下篇文章中,我們將分享微服務架構方面的內容。敬請期待。
下面是《程序員練級攻略》系列文章的目錄。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章