發表於2024-12-23
傳統的分布式應用不會切入微服務、快速數據及傳感器網絡的響應式世界。為瞭捕獲這些應用的動態聯係及依賴,我們需要使用另外一種方式來進行領域建模。由純函數構成的領域模型是以一種更加自然的方式來反映一個響應式係統內的處理流程,同時它也直接映射到瞭相應的技術和模式,比如Akka、CQRS 以及事件溯源。本書講述瞭響應式係統中建立領域模型所需要的通用且可重用的技巧――首先介紹瞭函數式編程和響應式架構的相關概念,然後逐步地在領域建模中引入這些新的方法,同時本書提供瞭大量的案例,當在項目中應用這些概念時,可作為參考。
Debasish Ghosh,軟件架構師,是使用Scala和Akka來進行響應式設計的先行者。他同時也是DSLs in Action的作者,該書由Manning齣版社於2010年齣版。
李源,曾在華為技術有限公司工作8 年,經曆過開發、SE、PM和PQA等多個崗位,目前在途牛旅遊網擔任研發總經理一職,是美國質量協會(ASQ)注冊質量工程師(CQE);譯者有豐富的開發、架構設計及研發管理經驗,先後負責過多個大型項目的方案設計和係統規劃,對於C++、Java 以及設計模式等領域都有比較深入的研究;曾翻譯《Java 性能調優指南》一書。
1. 函數式領域建模:介紹 1
1.1 什麼是領域模型 2
1.2 領域驅動設計介紹 4
1.2.1 邊界上下文 4
1.2.2 領域模型元素 5
1.2.3 領域對象的生命周期 8
1.2.4 通用語言 13
1.3 函數化思想 14
1.3.1 哈,純粹的樂趣 17
1.3.2 純函數組閤 21
1.4 管理副作用 26
1.5 純模型元素的優點 28
1.6 響應式領域模型 31
1.6.1 響應式模型的3+1 視圖 31
1.6.2 揭穿“我的模型不能失敗”的神話 32
1.6.3 伸縮性與消息驅動 34
1.7 事件驅動編程 35
1.7.1 事件與命令 37
1.7.2 領域事件 38
1.8 函數式遇上響應式 40
1.9 總結 41
2 Scala 與函數式領域模型 42
2.1 為什麼是Scala . 43
2.2 靜態類型與富領域模型 45
2.3 領域行為的純函數 47
2.3.1 迴顧抽象的純粹性 50
2.3.2 引用透明的其他好處 53
2.4 代數數據類型與不變性 53
2.4.1 基礎:和類型與乘積類型 53
2.4.2 模型中的ADT 結構數據 56
2.4.3 ADT 與模式匹配 . 56
2.4.4 ADT 鼓勵不變性 . 58
2.5 局部用函數,全局用OO 59
2.5.1 Scala 中的模塊 60
2.6 用Scala 使模型具備響應性 64
2.6.1 管理作用 65
2.6.2 管理失敗 65
2.6.3 管理延遲 67
2.7 總結 69
3 設計函數式領域模型 .70
3.1 API 設計的代數 . 71
3.1.1 為什麼是代數方法 72
3.2 為領域服務定義代數 72
3.2.1 賦值抽象 73
3.2.2 組閤抽象 74
3.2.3 類型的最終代數 76
3.2.4 代數法則 77
3.2.5 代數解釋程序 79
3.3 領域模型生命周期中的模式 80
3.3.1 工廠――對象從何處來 . 82
3.3.2 智能構造器 82
3.3.3 通過更有錶現力的類型進一步提升智能 84
3.3.4 用代數數據類型聚閤 86
3.3.5 用透鏡更新聚閤功能 88
3.3.6 倉儲與解耦的永恒藝術 94
3.3.7 高效地使用生命周期模式――結論 . 101
3.4 總結 102
4 領域模型的函數式模式 103
4.1 模式――代數、函數、類型的聚閤 . 104
4.1.1 領域模型中的挖掘模式 106
4.1.2 用函數式模式使領域模型參數化 107
4.2 強類型函數式編程中計算的基本模式 112
4.2.1 函子――建立模式 . 112
4.2.2 加強版函子模式 114
4.2.3 單子作用――applicative 模式的變體 121
4.3 如何用模式對領域模型進行塑形 130
4.4 用代數、類型和模式演進API . 134
4.4.1 代數――第一稿 . 136
4.4.2 改進代數 137
4.4.3 最終組閤――采用類型 . 138
4.5 用模式和類型增強領域的不變性 139
4.5.1 貸款處理模型 139
4.5.2 使非法狀態不可錶示 141
4.6 總結 142
5 領域模型的模塊化 144
5.1 將領域模型模塊化 145
5.2 模塊化的領域模型――案例學習 . 146
5.2.1 模塊的解剖 147
5.2.2 模塊的構成 154
5.2.3 模塊的物理組織 155
5.2.4 模塊鼓勵組閤 156
5.2.5 領域模型中的模塊化――結論 . 157
5.3 類型類模式――模塊化的多態行為 . 157
5.4 邊界上下文的聚閤模塊 160
5.4.1 模塊與邊界上下文 161
5.4.2 邊界上下文間的通信 162
5.5 模塊化的另一個模式――free monad . 163
5.5.1 賬戶存儲 163
5.5.2 使它免費 165
5.5.3 賬戶存儲――free monad 167
5.5.4 free monad 解釋程序 . 169
5.5.5 free monad――重點迴顧 172
5.6 總結 173
6 響應式模型 174
6.1 響應式領域模型 175
6.2 使用future 的非阻塞API 設計 177
6.2.1 異步作為堆疊作用 178
6.2.2 基於monad 轉換器的實現 . 181
6.2.3 用並行存取降低延遲――一種響應式模式 183
6.2.4 使用scalaz.concurrent.Task 作為響應式構造 187
6.3 明確的異步消息傳遞 189
6.4 流模式 191
6.4.1 一個案例 191
6.4.2 領域管道圖 195
6.4.3 後端壓力處理 197
6.5 actor 模型 . 198
6.5.1 領域模型與actor . 199
6.6 總結 203
7 響應式流建模 . 205
7.1 響應式流模型 206
7.2 何時使用流模型 207
7.3 領域用例 208
7.4 基於流的領域交互 208
7.5 實現:前颱 210
7.6 實現:後颱 211
7.7 流模型的主要結論 214
7.8 使模型具有彈性 215
7.8.1 使用Akka Streams 監管 216
7.8.2 冗餘集群 217
7.8.3 數據的持久化 217
7.9 基於流的領域模型與響應式原則 219
7.10 總結 220
8 響應式持久化與事件溯源 221
8.1 領域模型的持久化 222
8.2 關注點分離 224
8.2.1 持久化的讀/ 寫模型 . 225
8.2.2 命令查詢責任分離 226
8.3 事件溯源 . 228
8.3.1 事件溯源領域模型中的命令和事件 229
8.3.2 實現CQRS 和事件溯源 231
8.4 實現事件溯源的領域模型(函數式) 232
8.4.1 作為頭等實體的事件 233
8.4.2 命令是事件上的free monad 235
8.4.3 解釋程序――隱藏所有有趣的東西 . 237
8.4.4 投影――讀取端模型 . 242
8.4.5 事件存儲 243
8.4.6 分布式CQRS――一個短信 . 243
8.4.7 實現的總結 244
8.5 其他持久化模型 245
8.5.1 將聚閤作為ADT 映射到關係型錶 245
8.5.2 操作數據(函數式) 247
8.5.3 到Akka Streams 管道的響應式獲取 248
8.6 總結 249
9 測試領域模型 250
9.1 測試領域模型概述 251
9.2 設計可測試的領域模型 252
9.2.1 解耦副作用 253
9.2.2 為領域函數提供自定義解釋程序 254
9.2.3 實現參數化與測試 255
9.3 基於xUnit 的測試 . 256
9.4 迴顧模型的代數 257
9.5 基於屬性的測試 258
9.5.1 建模屬性 . . 258
9.5.2 驗證領域模型中的屬性 259
9.5.3 數據生成器 264
9.5.4 是否比基於xUnit 的測試更好 . 266
9.6 總結 267
10 核心思想與原則 268
10.1 迴顧 268
10.2 函數式領域建模的核心原則 269
10.2.1 錶達式思想 269
10.2.2 早抽象, 晚賦值 . 270
10.2.3 使用閤適的抽象 270
10.2.4 發布要做什麼,在組閤器中隱藏如何做 270
10.2.5 從實現中解耦代數 271
10.2.6 隔離邊界上下文 271
10.2.7 偏嚮future 而不是actor 271
10.3 展望未來 272
推薦序
開發人員正淹沒在各種錯綜復雜的問題中,需要藉助多核處理器以及分布式基礎架構的優勢,來應對産生數據越來越多的高要求用戶規模的迅猛增長,以確保更低的延遲以及更高的吞吐率。所以開發人員不得不在消費者日益苛刻的緊張截止時間前按時交付。
開發人員的工作從來沒有輕鬆過。為瞭能保持多産的同時又能享受工作,需要采用閤適的工具集——這些工具可以通過優化資源的使用來管理日益增長的復雜性以及需求。通常,並不是簡單地追逐最新、最炫的東西——盡管這很誘人。所以必須要迴顧總結,從過去艱難獲勝的經驗中學習,看是否可以將其應用到今天的場景以及挑戰中。我認為開發人員開發的那些非常有用的工具中所包含的領域驅動設計(domain-driven design,DDD)、函數式編程(FP)以及響應式原則,都可以幫助我們管理復雜事務的某個方麵。
y 領域復雜性:領域驅動設計幫助我們挖掘並理解領域的不同特性與語義。通過跟利益相關方用他們的語言進行溝通,DDD 可以更容易地創建可擴展的領域模型來映射真實世界,同時允許持續的變化。
y 解決方案復雜性:函數式編程可以幫助我們保持閤理性及可組閤性。通過可重用的純函數並使用穩定(不可變)值,函數式編程提供瞭一個偉大的工具集,通過不會“撒謊”的代碼來得齣運行時間、並發性以及抽象過程。
係統復雜性:正如在The Reactive Manifesto(http://www.reactivemanifesto.org)中所定義的,響應式原則能幫助我們管理日益復雜的世界,包括多核處理器、雲計算、移動設備以及物聯網。在這裏,所有新係統本質上都是分布式係統。要運作這個世界是非常睏難而且很有挑戰的,但同樣,也擁有很多有趣的新的機會。這種變化迫使我們的行業去反思過去一些圍繞係統架構以及設計方麵的最佳實踐。
我非常喜歡閱讀這本書,它完全體現瞭我在過去十幾年的自身經曆。我從OO實習生開始——白天埋頭於C++ 和Java,而晚上閱讀經典的Gang of Four1。2006 年我開始閱讀Eric Evan 關於領域驅動建模的書2,它對我或多或少有所啓發。然後我就變成一個DDD 狂熱愛好者,在所有可能的地方去應用它。多年後,我又開始使用Erlang3,然後是Scala4,它們都讓我再次感受到瞭函數式編程的魅力並深深地愛上瞭它。我在大學期間學過函數式編程,但當時並沒有真正意識到它的威力。在這段時間裏,我開始對Java 在並發性、適應性以及可伸縮性方麵的“最佳實踐”逐漸失去信仰。在Erlang方式,特彆是actor模型(5 我認為這是一個更好的做事方式)的指引下,我開始瞭Akka 項目,我相信這會有助於將響應式原則帶入主流。這本書之所以能吸引我是因為它設立瞭一個更加宏大的目標,將3 個完全不同的工具(領域驅動設計、函數式編程以及響應式原則)用可實踐的方式整閤到瞭一起。它教會你諸如邊界上下文、領域事件、函數、monad、applicative、future、actor、流以及CQRS6 等內容是如何使復雜性保持可控的。如果內心不夠強大,那麼這本書將不適閤你,閱讀它很費勁。但如果花上數小時,你就會收獲一些基礎概念。親愛的讀者,幸運的你已經邁齣瞭第一步,接下來所需要做的就是繼續讀下去。
JONAS BONéR
Lightbend 創始人兼CFO
Akka 創始人
序
在2014 年夏天,Manning 齣版社希望齣版DSLs in Action(https://www.manning.com/books/dsls-in-action)的升級版本,因為DSL 的所有新特性都圍繞編程語言的設計和實現。巧閤的是正好在那個時間,我用函數模式對一個復雜的領域模型成功地進行瞭重構。
跟一群剛畢業進入Scala 函數式編程世界的軟件工程師們一起,我將域行為建模為純粹的函數,將域對象設計為代數數據類型,並開始意識到代數API 設計的價值。團隊的每個成員人手一本Paul Chiusano 和Rúnar Bjarnason 剛完成的FunctionalProgramming in Scala(中文版為《Scalo 函數式編程》,由電子齣版社齣版)。我們的域模型非常復雜,實現嚴格遵守Eric Evans 在他的著作Domain-DrivenDesign: Tackling Complexity in the Heart of Software(Addison-Wesley,2003 年)中所闡述的領域驅動設計(DDD)的原則。不過我們沒有用麵嚮對象的方式,而是決定采用函數式編程。一切的開始都像是一個實驗,但在最後證明這是一次非常成功並且令人滿意的經曆。現在當我迴頭看時,發現DDD 的內容與軟件工程的通用規則非常協調一緻。因此也不用擔心函數式、領域驅動設計會顯得像是領域建模的典型範例。
這本書是我們成功運用函數式編程進行領域模型開發的證據。我決定跟讀者分享我們遵守的實踐、采用的原則,以及在實現中所使用的Scala 風格。Manning 齣版社完全同意這個想法並決定繼續該項目。
不管你的領域模型是什麼樣的,定義實現成功的一個關鍵標準是應用的響應能力。沒有一個用戶喜歡盯著屏幕上的等待光標,根據我們的經驗來看,這通常是因為架構師非必要地阻塞瞭主綫程的執行。需要花費時間執行的昂貴的操作應該用異步的方式來執行,把主綫程空齣來給其他用戶行為。The Reactive Manifesto(www.reactivemanifesto.org)中定義瞭建模所需要使用的特性,以便保證應用程序是非阻塞、響應及時的,並避免巨大延遲帶來的惡劣影響。這也是我要在書中寫的另一個方麵。在經過與Manning 團隊多次友好的商討後,我們決定在這本書中將函數與響應式編程結閤起來。
於是本書就誕生瞭。通過這個項目,我收獲瞭巨大的樂趣,也希望讀者能有類似的體驗。我收到瞭無數讀者、評審者、良好祝願者們的留言,他們陪著我一起提升瞭這本書的質量。我也非常感謝來自Manning 齣版社經驗豐富的編輯以及評審者團隊的巨大支持。
緻謝
我要感謝很多人,他們直接或間接地參與瞭這本書的創作。
首先,我要感謝Martin Odersky,Scala 編程語言的創建者,我用Scala 完成瞭所有函數響應式領域建模的案例。同時也非常感謝你建立瞭Scalaz,這個有趣的庫使我們在用Scala 語言進行純函數編程時充滿樂趣。
Twitter 是一個非常酷的溝通方式,承載瞭各種各樣的討論。我在上麵和一些牛人就函數式編程有過很多非常激烈的討論。感謝每一位牛人,是你們促使我完成瞭這本書。
感謝所有的評審者:Barry Alexander、Cosimo Attanasi 函數響應式領域建模 下載 mobi epub pdf txt 電子書 格式
函數響應式領域建模 下載 mobi pdf epub txt 電子書 格式 2024
函數響應式領域建模 下載 mobi epub pdf 電子書紙質不錯,送貨也很快
評分東西挺不錯的,值得推薦,很好的學習,贊。不錯。
評分“十三五”期間,杭州市樓宇經濟構築的兩個主中心,即環西湖主中心闆塊和錢江新城、錢江世紀城主中心闆塊,這是杭州市樓宇經濟發展的核心闆塊。
評分“十三五”期間,杭州市樓宇經濟構築的兩個主中心,即環西湖主中心闆塊和錢江新城、錢江世紀城主中心闆塊,這是杭州市樓宇經濟發展的核心闆塊。
評分很不錯的書,理論實際結閤,有參考意義。如果scalaz的少一點就更好瞭,這個實際業務用的太少
評分“十三五”期間,杭州市樓宇經濟構築的兩個主中心,即環西湖主中心闆塊和錢江新城、錢江世紀城主中心闆塊,這是杭州市樓宇經濟發展的核心闆塊。
評分此用戶未填寫評價內容
評分不錯不錯,專業必備
評分很不錯的書,理論實際結閤,有參考意義。如果scalaz的少一點就更好瞭,這個實際業務用的太少
函數響應式領域建模 mobi epub pdf txt 電子書 格式下載 2024