內容簡介
   對於想要學習Akka的Java 和 Scala 開發者們,有很多技術資源可供參考,但是如要想知道如何去應用這些技術就需要不同的思維方式瞭。為瞭幫助你正確地使用Akka,這本實用的實踐指南提供瞭若乾高級的設計模式,還包括瞭如何以及何時應用那些模式去解決在大型分布式係統中遇到的實際問題的一些案例。
     作者簡介
   Michael Nash是Lightbend 的總監。過去30 多年間,他為各種規模的公司及客戶設計、開發、發布瞭很多軟件項目。作為項目管理和架構實踐的軟件工藝倡導者,他是“安全堆棧”*早的實踐者之一,在Scala、Akka 和Spray 方麵有五年以上的工作經驗。他大部分業餘時間緻力於“安全響應式平颱”的相關工作,在會議中發錶主題演講,以及在軟件相關領域撰寫書籍。Wade Waldron是Lightbend 的高級顧問。他現在針對Lightbend 響應式平颱提供培訓和谘詢服務。在Lightbend 之外,Wade 在過去9 年中一直在建立堅實的軟件和遊戲,重點是設計測試驅動、設計域驅動、設計麵嚮服務的架構、設計事件驅動架構以及敏捷開發。
高中開始接觸編程,大學期間參加各種比賽,獲得許多奬項。也因為比賽,大三就獲得瞭微軟的實習機會,學習到很多學校學不到的東西。也因此開始一有時間就會去各種公司實習,瞭解不同公司的企業文化。比較典型的程序員,熱愛編程,喜歡研究算法,也喜歡學習各種好玩的開源項目。由於自身工作經曆,對於分布式係統的實踐經驗有豐富的經驗。
     目錄
   目錄  
前言 .......................................................................................... xvii  
第1 章 Actor 模型 ........................................................................1  
現實是最終一緻的 .................................................................................................1  
解構Actor 模型 .....................................................................................................3  
所有的計算都在一個actor 中執行 .........................................................................4  
actor 之間隻能通過消息進行通信 .........................................................................5  
actor 可以創建子actor ...........................................................................................6  
actor 可以改變自己的狀態或行為 .........................................................................8  
一切都是actor .......................................................................................................9  
Actor 模型的使用 .................................................................................................10  
定義清晰的邊界 ................................................................................................... 11  
何時適閤使用Actor 模型 ....................................................................................13  
結論 .....................................................................................................................13  
第2 章 Akka 簡介 .......................................................................15  
Akka 是什麼......................................................................................................... 15  
Akka 是開源的 .............................................................................................. 15  
Akka 正在蓬勃發展 .......................................................................................16  
Akka 是為分布式設計的 ...............................................................................16  
Akka 組件 ............................................................................................................17  
Akka actor .....................................................................................................17  
子actor .......................................................................................................... 18  
remoting :不同JVM 上的actor ....................................................................20  
clustering :集群成員的自動化管理 ..............................................................20  
Akka HTTP ...................................................................................................24  
TestKit ........................................................................................................... 25  
contrib ........................................................................................................... 25  
Akka OSGi ................................................................................................... 25  
Akka HTTP ...................................................................................................26  
Akka Streams ................................................................................................26  
Akka 實現的Actor 模型 ......................................................................................26  
Actor 模型中的Akka actor ..................................................................................26  
消息傳遞 .......................................................................................................27  
actor 係統 ...................................................................................................... 28  
Akka Typed 項目 .................................................................................................. 28  
結論 ....................................................................................................................29  
第3 章 分布式領域驅動設計 ........................................................31  
DDD 概述 ............................................................................................................31  
DDD 的好處 .........................................................................................................32  
DDD 組件 ............................................................................................................33  
域實體 ..................................................................................................................34  
域值對象 .............................................................................................................34  
聚閤與聚閤根 ..................................................................................................... 35  
倉儲 .....................................................................................................................37  
工廠和對象創建 ................................................................................................... 38  
域服務 .................................................................................................................. 38  
有界上下文 ..........................................................................................................39  
結論 ....................................................................................................................41  
第4 章 優秀的Actor 設計 ...........................................................43  
大係統小做 ..........................................................................................................43  
封裝actor 中的狀態 ............................................................................................44  
使用字段封裝狀態 .......................................................................................44  
使用“狀態”容器封裝狀態 ........................................................................47  
使用become 封裝狀態 ................................................................................. 48  
將futures 與actors 混閤 ............................................................................... 50  
Ask 模式和替代方案 ............................................................................................ 54  
Ask 模式的問題 ........................................................................................... 55  
附帶的復雜性 ................................................................................................ 57  
Ask 的替代方案 ........................................................................................... 57  
命令與事件 .......................................................................................................... 59  
構造函數的依賴注入 ....................................................................................61  
使用路徑查找actor ......................................................................................61  
結論 ....................................................................................................................62  
第5 章 數據流 ............................................................................63  
吞吐量與延遲 ......................................................................................................63  
流 .........................................................................................................................64  
路由器 ..................................................................................................................66  
郵箱 ..................................................................................................................... 68  
無界郵箱 ...................................................................................................... 68  
有界郵箱 ......................................................................................................69  
拉取的工作模式 ..................................................................................................70  
背壓 .....................................................................................................................73  
ack .................................................................................................................73  
高水位標記 ...................................................................................................73  
隊列長度監控 ................................................................................................74  
速率監控 ......................................................................................................74  
Akka 數據流.........................................................................................................74  
源 .................................................................................................................. 75  
匯 ..................................................................................................................77  
RunnableGraph ............................................................................................. 78  
流 ..................................................................................................................79  
交叉點 ........................................................................................................... 80  
Akka 流中的背壓 ......................................................................................... 81  
Akka 流的使用 ............................................................................................. 82  
結論 .................................................................................................................... 84  
第6 章 一緻性和可擴展性 ...........................................................85  
事務和一緻性 ...................................................................................................... 85  
強一緻性與最終一緻性 ....................................................................................... 86  
並發性與並行性 ................................................................................................... 86  
為什麼全局一緻的分布式狀態影響可擴展性 ...................................................... 86  
位置透明性 ......................................................................................................... 87  
交付保證 ............................................................................................................. 87  
最多投遞一次 ................................................................................................ 87  
最少投遞一次 ................................................................................................ 88  
恰好一次交付是不可能的(但可以近似做到) .............................................91  
如何近似做到恰好一次交付 .........................................................................91  
集群單例 .......................................................................................................92  
可擴展性 ..............................................................................................................94  
避免全局狀態 ............................................................................................... 98  
避免共享狀態 ............................................................................................... 98  
遵循Actor 模型 .............................................................................................99  
避免順序操作 ...............................................................................................99  
隔離阻塞型操作 ...........................................................................................99  
監控和調優 ..................................................................................................99  
集群分片和一緻性 ...............................................................................................99  
分片 ............................................................................................................. 100  
Akka 中的分片 ........................................................................................... 101  
分片鍵的生成 ............................................................................................. 102  
分片的分布 ................................................................................................ 103  
一緻性邊界 ................................................................................................. 103  
可擴展性邊界 ............................................................................................. 104  
分片聚閤根 ................................................................................................ 105  
持久化 ......................................................................................................... 106  
鈍化 ............................................................................................................. 106  
使用集群分片保證一緻性 ........................................................................... 107  
結論 .................................................................................................................. 109  
第7 章 容錯 .............................................................................111  
故障類型 ........................................................................................................... 112  
異常 ............................................................................................................ 112  
JVM 中的緻命錯誤 .................................................................................... 113  
外部服務故障 ............................................................................................. 113  
不符閤服務等級協議 .................................................................................. 113  
操作係統和硬件級故障 .............................................................................. 114  
故障隔離 ........................................................................................................... 114  
艙壁模式 .................................................................................................... 114  
優雅降級 ..................................................................................................... 117  
使用Akka 集群隔離故障 ............................................................................ 119  
使用熔斷器控製故障 ................................................................................... 119  
故障處理 ............................................................................................................ 122  
異常處理 ..................................................................................................... 123  
外部服務的故障處理 .................................................................................. 128  
結論 ................................................................................................................... 131  
第8 章 可用性 ..........................................................................133  
微服務和單體式應用 ........................................................................................ 133  
用有界上下文劃分微服務 ................................................................................. 134  
細粒度的微服務 ................................................................................................. 135  
集群感知路由器 ................................................................................................. 135  
分布式數據 ....................................................................................................... 137  
優雅降級 ............................................................................................................ 140  
部署 ................................................................................................................... 141  
分階段部署/ 滾動重啓 ..................................................................................... 142  
藍/ 綠部署 ........................................................................................................ 142  
崩潰恢復/ 運維監測 ......................................................................................... 143  
健康檢查和應用狀態頁麵 .......................................................................... 143  
度量 ............................................................................................................ 145  
日誌 ............................................................................................................. 146  
看門狗工具 ................................................................................................. 146  
結論 .................................................................................................................. 147  
第9 章 性能 ...........................................................................149  
隔離瓶頸 ........................................................................................................... 150  
優化Akka ......................................................................................................... 150  
減少或隔離阻塞型操作 .............................................................................. 150  
縮短消息處理時間 ...................................................................................... 151  
增加處理消息的actor ................................................................................ 151  
派發器 ................................................................................................................ 151  
標準派發器 ................................................................................................. 151  
固定派發器 ................................................................................................. 153  
平衡派發器 ................................................................................................ 154  
calling-thread 派發器 .................................................................................. 154  
何時使用單獨的派發器 .............................................................................. 155  
提高並行性 ................................................................................................ 157  
結論 .................................................................................................................. 158  
後記 ..........................................................................................159  
參考文獻 ...................................................................................161  
關於作者 ...................................................................................162  
封麵介紹 ...................................................................................163      
前言/序言
   前言
 響應式應用開發是軟件開發的新前沿。 隨著聯網設備的普及,數據量也在增加。以前的單綫程批處理數據的舊技術根本無法滿足這個新領域所提齣的需求。大數據的概念已經興起,我們需要新的工具和新的技術來應對它。
 通常,解決現有問題的靈感並不是來自現有的技術,而是來自過去的經驗。許多現今用於處理大數據的新工具實際上是基於舊的actor 的概念而産生的。actor 是構建Akka 的關鍵概念,但其根源追溯起來應該屬於過去。actor 不是一個新概念,相反,它是一個被重新關注的舊概念。
 當開始探索Akka、actor、streams 和其他與之相關的技術時,我們將從現實世界的角度來看待它們:如何在一係列項目中安排一組人,同時優化他們的可用時間及技能?這是一個復雜的問題,並不是隻用一個下午就可以解決的。但這又是一個有趣的問題,為深度探索提供瞭很大的空間。這也是大多數軟件開發人員在職業生涯中的某個時刻一定會遇到的問題。 在對Akka 進行探索的過程中,我們將迴顧這個問題。
 在解決問題之前,我們必須先瞭解可用的工具,還需要瞭解這些工具為什麼存在,以及它們可以解決什麼樣的問題。我們需要知道Akka 的起源及其在Actor 模型中的根源。我們需要一套指導原則將應用程序拼接在一起,這套原則會在探索域驅動設計(DDD)的過程中被發現。有瞭這些基礎,便可以開始使用Akka 提供的所有工具來構建域瞭。我們可以探索簡單的actor 的使用方法以及它如何與流關聯,可以讓係統分布在多個節點上,使其具有更好的容錯性、可用性及可擴展性。
 首先,我們需要知道這一切的根源在哪裏。
 
 
 譯者序
 我在大學期間開始接觸並使用Scala,當時就發現瞭這門語言的強大。正如其名字所錶達的那樣,Scala 是一門可擴展的編程語言,融閤瞭函數式編程和麵嚮對象編程的特點,支持並發,讓異步編程變得很自然,同時錶達能力也特彆強。雖然Scala 的學習成本會比較高,尤其和Golang、Python 這類語言相比,但是這門語言還是非常實用的,對提高開發效率很有幫助。而且Scala 的創始人Martin Odersky 說過:“Scala 現在是為聰明人創造的,以後也是為聰明人服務的。” Scala 相信程序員的聰明纔智,讓程序員自行選擇閤適的結構,以應對韆變萬化的任務需求,這一點是Scala 做得很不錯的地方。
 編寫正確的具有容錯性和可擴展性的分布式、高並發程序非常睏難,主要是因為我們使用瞭錯誤的工具和錯誤的抽象層次,而Akka 的齣現改變瞭這種情況。Akka 是參照Apache 2 許可證(一種公認的開源許可證)發布的開源項目,通過使用Actor 模型來提高抽象的級彆,並提供瞭一個更好的平颱來構建可擴展的、有彈性的、響應式的應用程序,詳細信息可參閱The Reactive Manifesto。對於容錯,Akka 采用“讓它崩潰(Let It Crash)”的模式,這種模式可以幫助構建可自我修復和永不停止的軟件係統。其中actor還提供瞭透明的分布式抽象,以及真正的可擴展與高容錯應用的基礎設施。
 畢業後,我在騰訊微信團隊的後颱架構部從事軟件開發工作,作為騰訊的戰略級産品,微信平均每天麵臨億級的在綫用戶。麵對這種用戶規模的挑戰,基本每一行代碼都需要考慮高並發和分布式的場景,大道至簡的思想基本貫徹在整個技術産品綫上。例如,大係統小做,讓一切可擴展;剝離復雜,讓剩下的更簡單;在容災之前麵嚮最壞情況思考,防止雪崩;精細監控,迅速響應等。微信團隊內部的很多技術點也和Actor 模型很像,比如微信最核心的消息模型和Actor 的郵件模型就很有淵源。消息被發齣後,會先在後颱臨時存儲,為瞭使接收者能更快接收到消息,係統會推送通知給接收者,最後客戶端主動到服務器端拉取消息。當然整個微信架構就是微服務的架構,每一個請求後麵可能會涉及幾百個服務。如何擴展、如何高容錯、如何彈性,這些基本是每天都會遇到的挑戰,並且也都是設計和開發係統的時候需要考慮的事情。
 後來,我離開騰訊,在獵豹移動的廣告係統架構部以及新聞團隊從事係統架構開發工作,同樣涉及微服務架構,每天都要考慮到這些分布式係統可能遇到的並且需要處理的問題。尤其廣告係統涉及金錢,因而需要嚴格保證其高可用性和一緻性。
 現在,我在創業公司擔任技術負責人,同時負責公司內部多個係統的架構工作,也需要時時刻刻考慮和處理高並發、高容錯等分布式問題,同樣用到瞭高並發的分布式微服務架構。
 本書原名是Applied Akka Patterns :A Hands-On Guide to Designing Distributed Applications,書中介紹瞭一些很好的分布式係統的設計原則,而且也介紹瞭Actor 模型和Akka 工具包,對於使用JVM 體係結構的開發者來說是非常值得一看的,因為通過本書能很快地學習並掌握一個強大的工具,在工作中提高生産效率。對於那些使用非JVM體係結構的開發者來說,通過這本書能瞭解到一個更強大的工具,也是極有幫助的。同時,本書介紹的很多指導原則對於分布式係統設計有很大的藉鑒意義,可以避免讓自己陷入睏境。這本書是一個起點,幫助我們發現新大陸,但絕不會是我們的終點,開拓這塊新大陸還需要自己不斷努力。其實Scala 本身就是一門很強大的語言,最近也因為Spark、Kafka 等項目在國內掀起瞭一波關注熱潮。Akka 也很優秀,以至於被 Lightbend 收購,並直接用Akka 的actor 替代瞭Scala 本身的actor。總之,本書中介紹的內容都是非常值得探索和學習的。
 決定翻譯這本書,不僅因為我參與和主導瞭不少分布式的項目,也因為對分布式係統設計和開發的熱愛,以及對Scala 語言本身的喜歡。我抱著把Actor 模型以及Akka 傳遞給中國的工程師並讓更多人能接觸、瞭解它們的態度來嘗試翻譯這本書。雖然它們在國內還不算太火,但是在國外已經非常受歡迎。
 這本書雖然隻有160 多頁,但是翻譯過程還是比較辛苦的,很多地方的意思都比較隱晦,用中文直譯會很有挑戰。所以我平時會留意大傢在社區裏討論的內容,參考社區裏的資料,在遇到一些和自己項目經驗不太一緻或者比較不確定的地方,也會嘗試去查看Akka的源碼來盡量保證自己的理解無誤,避免誤導讀者。
 在本書的翻譯工作結束之際,我首先要感謝博雲科技的CTO 李亞瓊老師,他的引薦讓我獲得瞭翻譯這本書的機會。還要感謝孫國立、曾傑瑜、付冉、劉岸,他們在百忙中幫我審閱瞭本書翻譯稿的大部分章節,並針對涉及的專業概念提齣不少修改意見。最後要感謝本書的策劃編輯孫奇俏,她為本書的編輯和校對做瞭大量細緻的工作。
 翻譯過程中雖力求理解作者意圖,把握全文,但是難免會發生錯誤,若廣大讀者發現錯誤,我在此深錶歉意。歡迎廣大讀者及時與我和齣版社聯係,提交勘誤,方便後續讀者更好地閱讀。如果有任何好的想法和建議,也歡迎和我郵件溝通,我的郵箱地址是hangzhong.yu@gmail.com。
 虞航仲
 2017 年8 月於北京
 
    
				 
				
				
					Akka應用模式:分布式應用程序設計實踐指南  圖書簡介  在這本深入的指南中,我們將一同探索Akka這個強大的工具集,它為構建健壯、高可用且可擴展的分布式係統提供瞭堅實的基礎。本書並非空泛的理論闡述,而是聚焦於解決實際問題,通過一係列精心設計的應用模式,引導您掌握如何在復雜的分布式環境中有效地設計、開發和部署應用程序。我們將深入剖析Akka的核心概念,並展示如何將這些概念轉化為可行的、經過實踐檢驗的設計方案。  核心理念與基石:Actors、消息傳遞與不可變性  理解Akka的精髓,離不開對其核心理念的深刻洞察。本書將從最基礎的Actor模型入手,詳細講解Actor的生命周期、狀態管理以及它們如何通過異步消息傳遞進行通信。我們將摒棄傳統的綫程與鎖的復雜糾纏,擁抱Akka所倡導的“一切皆Actor”的哲學。通過大量的代碼示例和圖示,您將清晰地理解Actor如何成為分布式係統中獨立、隔離的計算單元,以及它們之間如何通過“彆無選擇”的消息傳遞機製來實現高效協作。  不可變性是Akka設計中的另一塊重要基石。我們將深入探討為什麼不可變數據結構在分布式環境中至關重要,以及它們如何顯著簡化並發編程的復雜性,消除競態條件,並提升係統的整體可靠性。您將學會如何利用Akka提供的工具和模式來有效地處理不可變數據,從而構建更加安全和易於推理的係統。  分布式應用模式的實踐  本書的主體內容將圍繞一係列經過驗證的Akka應用模式展開,這些模式是應對分布式係統挑戰的實戰策略:     Actor層級與容錯(Supervision Strategies): 在分布式係統中,組件的失敗是不可避免的。本書將詳細介紹Akka強大的Actor層級結構,以及如何利用其內置的容錯機製來管理Actor的生命周期。我們將深入探討不同的監督策略(如“停止”、“重啓”、“恢復”、“升級”)及其適用場景,並通過實際案例演示如何構建能夠自我 healing 的分布式係統,最大限度地減少因局部故障對整體可用性的影響。您將學會如何設計Actor的層級結構,確保係統能夠優雅地處理異常,並在錯誤發生時快速恢復。     狀態管理與持久化(State Management and Persistence): 分布式係統需要可靠的狀態管理。本書將詳細介紹Akka Persistence,一個為Actor提供持久化能力的強大模塊。您將學習如何使用Event Sourcing和CQRS(Command Query Responsibility Segregation)等模式來構建能夠處理高並發讀寫請求的係統。我們將演示如何將Actor的狀態持久化到各種後端存儲(如數據庫、文件係統),並演示如何從持久化的事件流中恢復Actor的狀態。這將幫助您構建能夠應對數據丟失風險、提供強大一緻性保證的應用程序。     集群與分布式協調(Clustering and Distributed Coordination): 構建大規模分布式係統離不開集群的概念。本書將深入探討Akka Cluster,它使得跨多個節點的Actor係統能夠無縫協作。您將學習如何設置Akka Cluster,配置成員加入與離開機製,以及如何利用集群singleton、分布式數據(Distributed Data)和分布式鎖(Distributed Locks)等高級特性來實現跨節點的分布式協調和狀態同步。通過實際場景的演練,您將能夠構建高度可用的、能夠自動伸縮的分布式服務。     消息路由與負載均衡(Message Routing and Load Balancing): 在大型分布式係統中,高效的消息路由和負載均衡是提升係統吞吐量和響應速度的關鍵。本書將介紹Akka的Router機製,演示如何使用不同的路由策略(如輪詢、隨機、一緻性哈希)來將消息分發到Actor的池中。您將學會如何根據業務需求選擇最閤適的路由策略,從而有效地平衡節點負載,防止單點過載,並提升整體係統的性能。     流式處理與事件驅動(Streaming and Event-Driven Architectures): 現代應用程序越來越傾嚮於事件驅動和流式處理。本書將深入介紹Akka Streams,一個用於構建響應式流式處理應用程序的聲明式API。您將學習如何使用Source、Flow和Sink來組閤和處理數據流,實現低延遲、高吞吐量的數據管道。我們將演示如何將Akka Streams與其他Akka模塊(如Akka Cluster)結閤,構建復雜的事件驅動係統,處理實時數據分析、消息隊列集成等場景。     分布式緩存與數據一緻性(Distributed Caching and Data Consistency): 高性能的分布式應用通常需要高效的緩存機製。本書將探討如何在Akka環境中實現分布式緩存,並重點關注數據一緻性問題。我們將介紹Akka Distributed Data提供的CRDTs(Conflict-free Replicated Data Types),以及如何利用它們來構建最終一緻性的分布式數據結構,從而在保證一定程度的數據一緻性的同時,實現高性能的讀寫操作。     與外部係統的集成(Integration with External Systems): 任何分布式係統都不可能孤立存在,與外部係統的集成是必不可少的。本書將提供指導,說明如何利用Akka的Actor模型與外部服務(如數據庫、消息隊列、REST API)進行交互。您將學習如何設計Actor來封裝外部係統的客戶端,並利用Akka的Actor間通信機製來實現異步、解耦的集成,從而提高係統的靈活性和可維護性。  高級主題與最佳實踐  除瞭核心的應用模式,本書還將涵蓋一些高級主題和最佳實踐,幫助您更上一層樓:     性能調優與監控(Performance Tuning and Monitoring): 構建高性能的分布式係統需要細緻的調優和持續的監控。我們將探討Akka的性能特點,提供識彆瓶頸和進行優化的技巧。您將學習如何利用Akka提供的監控工具和第三方解決方案來跟蹤Actor的行為,分析消息流,並識彆潛在的性能問題。     測試策略(Testing Strategies): 分布式係統的測試是其復雜性所在。本書將介紹針對Akka應用程序的各種測試策略,包括單元測試、集成測試和端到端測試。您將學習如何利用Akka TestKit來模擬Actor的行為,構建可靠的測試場景,確保您的分布式組件能夠按預期工作。     部署與運維(Deployment and Operations): 將分布式係統成功部署到生産環境是關鍵一步。本書將討論Akka應用程序的部署考量,包括容器化(如Docker)、服務發現以及與CI/CD流程的集成。您將獲得關於如何在分布式環境中進行有效的係統管理和故障排除的指導。  麵嚮讀者  本書適閤有一定Java或Scala編程經驗,並希望深入理解和實踐分布式係統設計的開發者、架構師和技術領導者。無論您是初次接觸Akka,還是已經有所瞭解但希望係統性地掌握其應用模式,本書都將為您提供寶貴的知識和實用的指導。  本書的目標  通過閱讀本書,您將能夠:     深刻理解Akka的核心概念,並將其應用於實際開發中。    掌握多種Akka應用模式,並能夠根據具體場景選擇和實現。    構建健壯、高可用、可擴展的分布式應用程序,有效應對並發和容錯挑戰。    提升分布式係統的設計與開發能力,自信地應對復雜的係統需求。    為構建下一代分布式解決方案奠定堅實的基礎。  踏上Akka的應用之旅,本書將是您最可靠的嚮導。