微服務與事件驅動架構

[加]亞當·貝勒馬爾(Adam Bellemare)

  • 微服務與事件驅動架構-preview-1
  • 微服務與事件驅動架構-preview-2
微服務與事件驅動架構-preview-1

買這商品的人也買了...

商品描述

微服務既有同步實現,亦有異步實現。異步微服務架構以事件驅動,不受特定的API限制,系統的耦合度低,可擴展性強。本書教你從頭開始構建完整的事件驅動型微服務架構,根據實際的業務需求調整、擴展微服務,更好地實踐持續交付,並以新的視角思考如何充分利用實時數據的價值。

作者簡介

亞當·貝勒馬爾(Adam Bellemare),Confluent公司微服務架構師,精通大數據技術,曾受邀在Kafka峰會上做有關事件驅動型微服務的主題演講。


【譯者簡介】
溫正東,華南理工大學計算機碩士,曾任華為公司信息技術工程師,現任富途證券網絡增長研發總監,另譯有《Web安全開髮指南》。

目錄大綱

前言    xv
DI1 章 為什麼用事件驅動型微服務 1
1.1 什麼是事件驅動型微服務 2
1.2 領域驅動設計和界限上下文 3
1.2.1 運用領域模型和界限上下文 4
1.2.2 保持界限上下文與業務需求一致 4
1.3 溝通結構 5
1.3.1 業務溝通結構 5
1.3.2 實現溝通結構 6
1.3.3 數據溝通結構 7
1.3.4 康威定律和溝通結構 7
1.4 傳統計算中的溝通結構 8
1.4.1 選項1:創建一個新服務 8
1.4.2 選項2:將它加入現有服務中 9
1.4.3 兩種選項的利弊 9
1.4.4 團隊場景(續) 10
1.4.5 衝突的壓力 10
1.5 事件驅動的溝通結構 11
1.5.1 事件是通信的基礎 11
1.5.2 事件流提供了單一事實來源 11
1.5.3 消費者執行自己的建模和查詢 11
1.5.4 整個組織的數據溝通得到改善 12
1.5.5 高可訪問的數據利於業務變更 12
1.6 異步的事件驅動型微服務 12
1.7 同步式微服務 14
1.7.1 同步式微服務的缺點 14
1.7.2 同步式微服務的優點 15
1.8 小結 16
DI2 章 事件驅動型微服務基礎 17
2.1 構建拓撲 17
2.1.1 微服務拓撲 17
2.1.2 業務拓撲 18
2.2 事件內容 19
2.3 事件的結構 19
2.3.1 無鍵事件 19
2.3.2 實體事件 20
2.3.3 鍵控事件 20
2.4 物化來自實體事件的狀態 20
2.5 事件數據的定義和schema 22
2.6 微服務單一寫原則 22
2.7 用事件代理賦能微服務 23
2.7.1 事件存儲和服務 23
2.7.2 需要考慮的其他因素 24
2.8 事件代理與消息代理 25
2.8.1 從不可變日誌中消費 26
2.8.2 提供單一事實來源 27
2.9 大規模管理微服務 28
2.9.1 將微服務放到容器內 28
2.9.2 將微服務放到虛擬機內 28
2.9.3 管理容器和虛擬機 28
2.10 繳納微服務稅 29
2.11 小結 30
第 3 章 通信和數據契約 31
3.1 事件驅動數據契約 31
3.1.1 使用顯式schema作為契約 32
3.1.2 schema定義的註釋 32
3.1.3 全能的schema演化 33
3.1.4 有代碼生成器支持 33
3.1.5 破壞性的schema變更 34
3.2 選擇事件格式 36
3.3 設計事件 36
3.3.1 只講述事實 36
3.3.2 每個流都使用單一事件定義 37
3.3.3 使用最窄的數據類型 37
3.3.4 保持事件的單一用途 37
3.3.5 最小化事件 40
3.3.6 讓潛在的消費者參與事件設計 40
3.3.7 避免將事件作為信號量或信號 41
3.4 小結 41
第 4 章 將事件驅動架構與現有系統集成 42
4.1 什麼是數據解放 43
4.1.1 數據解放的折中方案 43
4.1.2 將被解放的數據轉化成事件 45
4.2 數據解放模式 45
4.3 數據解放框架 46
4.4 通過查詢實施數據解放 46
4.4.1 批量加載 47
4.4.2 增量時間戳加載 47
4.4.3 自增ID 加載 47
4.4.4 自定義查詢 47
4.4.5 增量更新 47
4.4.6 基於查詢更新的優點 48
4.4.7 基於查詢更新的缺點 48
4.5 使用變更數據捕獲日誌解放數據 49
4.5.1 使用數據存儲日誌的優點 50
4.5.2 使用數據庫日誌的缺點 50
4.6 使用發件箱表解放數據 51
4.6.1 性能考慮 52
4.6.2 隔離內部數據模型 52
4.6.3 確保schema兼容性 53
4.6.4 使用觸發器捕獲變更數據 56
4.7 對處於捕獲的數據集做數據定義變更 59
4.7.1 為查詢和CDC日誌模式處理事後數據定義變更 60
4.7.2 為變更數據表捕獲模式處理數據定義變更 60
4.8 將事件數據落地到數據存儲 60
4.9 數據落地和獲取對業務的影響 60
4.10 小結 62
第 5 章 事件驅動處理基礎 63
5.1 構建無狀態拓撲 64
5.1.1 轉換 64
5.1.2 分流與合流 65
5.2 對事件流再分區 65
5.3 對事件流協同分區 66
5.4 給消費者實例分配分區 67
5.4.1 使用分區分配器分配分區 68
5.4.2 分配協同分區 68
5.4.3 分區分配策略 68
5.5 從無狀態處理實例故障中恢復 70
5.6 小結 70
第 6 章 具有確定性的流處理 71
6.1 事件驅動工作流的確定性 72
6.2 時間戳 72
6.2.1 同步分佈式時間戳 73
6.2.2 處理帶時間戳的事件 74
6.3 事件調度和確定性處理 75
6.3.1 自定義事件調度器 75
6.3.2 基於事件時間、處理時間和攝取時間進行處理 75
6.3.3 消費者提取時間戳 76
6.3.4 對外部系統的“請求–響應”調用 76
6.4 水位 76
6.5 流時間 78
6.6 亂序事件和遲到事件 80
6.6.1 使用水位和流時間的遲到事件 81
6.6.2 亂序事件的原因和影響 81
6.6.3 時間敏感的函數和窗口化 83
6.7 處理遲到事件 85
6.8 再處理與近實時處理 86
6.9 間歇性故障和遲到事件 86
6.10 生產者/事件代理的連接性問題 87
6.11 小結與延展閱讀 88
第 7 章 有狀態的流 89
7.1 狀態存儲與從事件流中物化狀態 89
7.2 記錄狀態到變更日誌事件流 90
7.3 將狀態物化至內部狀態存儲 91
7.3.1 物化全局狀態 92
7.3.2 使用內部狀態的優點 92
7.3.3 使用內部狀態的缺點 93
7.3.4 內部狀態的伸縮和恢復 93
7.4 將狀態物化至外部狀態存儲 96
7.4.1 外部狀態的優點 97
7.4.2 外部狀態的缺點 97
7.4.3 外部狀態存儲的伸縮和恢復 98
7.5 重建與遷移狀態存儲 99
7.5.1 重建 99
7.5.2 遷移 100
7.6 事務與有效一次處理 100
7.6.1 示例:庫存計算服務 101
7.6.2 使用“客戶端–代理”事務的有效一次處理 102
7.6.3 沒有“客戶端–代理”事務的有效一次處理 103
7.7 小結 107
第 8 章 用微服務構建工作流 108
8.1 編排模式 109
8.1.1 一個簡單的事件驅動編排示例 109
8.1.2 創建和修改編排的工作流 110
8.1.3 監控編排的工作流 110
8.2 編制模式 111
8.2.1 一個簡單的事件驅動編制模式例子 112
8.2.2 一個簡單的直接調用的編制模式例子 113
8.2.3 對比事件驅動編制模式和直接調用的編制模式 114
8.2.4 創建和修改編制工作流 114
8.2.5 監控編制工作流 115
8.3 分佈式事務 115
8.3.1 編排型事務:saga模式 115
8.3.2 編制型事務 117
8.4 補償工作流 119
8.5 小結 119
第 9 章 使用“函數即服務”的微服務 120
9.1 設計基於函數的微服務解決方案 120
9.1.1 確保界限上下文的嚴格的成員關係 120
9.1.2 只在完成處理之後提交偏移量 121
9.1.3 少即是多 121
9.2 選擇FaaS供應商 122
9.3 在函數之外構建微服務 122
9.4 冷啟動和熱啟動 123
9.5 用觸發器啟動函數 124
9.5.1 基於新事件觸發:事件流監聽器 124
9.5.2 基於消費者組的滯後度觸發 125
9.5.3 按調度表觸發 126
9.5.4 使用網絡鉤子觸發 126
9.5.5 觸發資源事件 127
9.6 用函數執行業務工作 127
9.7 維持狀態 127
9.8 調用其他函數的函數 128
9.8.1 事件驅動通信模式 128
9.8.2 直接調用模式 129
9.9 終止和關閉 131
9.10 調整函數 132
9.10.1 分配足夠的資源 132
9.10.2 批量事件處理的參數 132
9.11 FaaS的伸縮方案 132
9.12 小結 133
第 10 章 基礎的生產者和消費者微服務 134
10.1 BPC的適用場合 134
10.1.1 集成現有遺留系統 135
10.1.2 不依賴於事件順序的有狀態的業務邏輯 136
10.1.3 當數據層完成大部分工作時 137
10.1.4 處理層和數據層獨立伸縮 137
10.2 具有外部流處理的混合BPC應用程序 138
10.3 小結 140
第 11 章 使用重量級框架的微服務 141
11.1 重量級框架的簡單歷史 142
11.2 重量級框架的內部運作 142
11.3 優點和局限性 144
11.4 集群搭建方案和執行模式 145
11.4.1 使用託管服務 146
11.4.2 構建自己的完整集群 146
11.4.3 使用CMS集成來創建集群 146
11.5 應用程序提交模式 148
11.5.1 驅動器模式 148
11.5.2 集群模式 148
11.6 處理狀態和使用檢查點 148
11.7 伸縮應用程序和處理事件流分區 149
11.7.1 伸縮運行中的應用程序 150
11.7.2 通過重啟伸縮應用程序 153
11.7.3 自動伸縮應用程序 153
11.8 從故障中恢復 153
11.9 考慮多租戶問題 153
11.10 語言和語法 154
11.11 選擇一個框架 154
11.12 示例:點擊和觀看的會話窗口 155
11.13 小結 157
第 12 章 使用輕量級框架的微服務 158
12.1 優點和局限性 158
12.2 輕量級處理 159
12.3 處理狀態和使用變更日誌 159
12.4 伸縮和故障恢復 160
12.4.1 事件洗牌 160
12.4.2 狀態分配 161
12.4.3 狀態復制和熱副本 161
12.5 選擇一個輕量級框架 161
12.5.1 Apache Kafka Streams 162
12.5.2 Apache Samza:嵌入模式 162
12.6 語言和語法 162
12.7 流–表–表聯結:增強模式 163
12.8 小結 166
第 13 章 集成事件驅動型和“請求–響應”型微服務 167
13.1 處理外部事件 167
13.1.1 自動生成的事件 168
13.1.2 由響應生成的事件 168
13.2 處理自動生成的分析事件 168
13.3 集成第三方“請求–響應”API 170
13.4 處理並提供有狀態的數據 171
13.4.1 實時請求內部狀態存儲 172
13.4.2 實時請求外部狀態存儲 175
13.5 在事件驅動的工作流中處理請求 177
13.6 “請求–響應”應用程序中的微前端 183
13.7 微前端的優點 184
13.7.1 基於組合的微服務 184
13.7.2 容易與業務需求對齊 185
13.8 微前端的缺點 185
13.8.1 可能不一致的UI元素和样式 185
13.8.2 不同的微前端性能 185
13.8.3 示例:體驗搜索與評論應用程序 186
13.9 小結 188
第 14 章 支持性工具 190
14.1 微服務–團隊分配系統 190
14.2 事件流的創建和修改 191
14.3 事件流元數據標記 191
14.4 限額 192
14.5 schema註冊表 192
14.6 schema創建和修改通知 193
14.7 偏移量管理 193
14.8 事件流的權限和訪問控制列表 194
14.9 狀態管理和應用程序重置 195
14.10 消費者偏移量滯後度監控 196
14.11 流水線型的微服務創建流程 196
14.12 容器管理控制 197
14.13 集群創建和管理 197
14.13.1 事件代理的程序化創建 197
14.13.2 計算資源的程序化創建 198
14.13.3 跨集群事件數據複製 198
14.13.4 工具的程序化創建 198
14.14 依賴跟踪和拓撲可視化 199
14.15 小結 202
第 15 章 測試事件驅動型微服務 203
15.1 通用測試原則 203
15.2 單元測試拓撲函數 203
15.2.1 無狀態的函數 204
15.2.2 有狀態的函數 204
15.3 測試拓撲 205
15.4 測試schema演化和兼容性 205
15.5 事件驅動型微服務的集成測試 206
15.6 本地集成測試 206
15.6.1 在測試代碼的運行時內創建臨時環境 208
15.6.2 在測試代碼外部創建臨時環境 209
15.6.3 使用mocking和模擬器方法集成託管服務 209
15.6.4 集成沒有本地支持的遠程服務 210
15.7 完全遠程集成測試 211
15.7.1 程序化創建臨時集成測試環境 211
15.7.2 使用共享環境進行測試 213
15.7.3 使用生產環境進行測試 214
15.8 選擇你的完全遠程集成測試策略 214
15.9 小結 215
第 16 章 部署事件驅動型微服務 216
16.1 微服務部署的原則 216
16.2 微服務部署的架構組件 217
16.2.1 持續集成系統、持續交付系統和持續部署系統 217
16.2.2 CMS和商業硬件 218
16.3 基本的全站式部署模式 218
16.4 滾動更新模式 220
16.5 破壞性的schema變更模式 220
16.5.1 通過兩個事件流達到最終遷移 222
16.5.2 同步遷移到新事件流 222
16.6 藍綠部署模式 223
16.7 小結 224
第 17 章 結論 225
17.1 通信層 225
17.2 業務領域和界限上下文 226
17.3 可共享的工具和基礎設施 226
17.4 結構化事件 226
17.5 數據解放和單一事實來源 227
17.6 微服務 227
17.7 微服務實現方案 228
17.8 測試 228
17.9 部署 229
17.10 結語 229
關於作者 230
關於封面 230