SlideShare a Scribd company logo
1 of 95
DDD架構設計
大綱
• 架構原理
• 分層架構
• 商業邏輯層的實現模式
• 微核心架構
• 事件驅動架構
• 服務導向架構
• 大型系統架構實務分析
• 回顧
軟體架構(Software Architecture)
軟體架構設計聽起來是
一門很厲害的學問,它到
底是什麼?
• 軟體架構是一種樣式(Pattern);它由許多軟體開發
人員的經驗所找出來的一種設計樣式
• 由於它是樣式,因此,沒有固定的程式碼撰寫方式
• 學習曲線較為陡峭
樣式(Pattern)
我知道它是樣式了,但是
什麼是樣式?
• 樣式是在特定的上下文中反覆出現的現象或是
行為動作
• 每個樣式帶來好處的同時也會附加它的負面效應
• 要注意樣式是有其特定的上下文的,不是任何情境
都可以直接套用
起點(Begin)
太棒了!那我要從那裡
開始學軟體架構設計?
• 先從分層開始學起
• 絕大多數的架構都是由分層架構演化而來的
• 分層架構是現行較多數開發人員所使用的架構
分層架構(N-Layer Architecture)
• 分層架構是所有軟體架構的基本雛型
• 每一層都只能呼叫自己位置的下層的元件;
不得直接呼叫非自己直屬的下層的元件
• 嚴格分明的階級讓元件的管理有了初步的
觀注點分離
分層的意義(meaning)
為什麼要遵守這堆奇怪
規矩,有什麼好處呢?
• 就像是遊戲規則一樣,所有人都遵守遊戲規則
整個活動才能夠繼續進行下去
• 分層可以帶來關注點分離;讓偵錯和程式碼的
維護變得更加容易
• 讓不同職責的程式碼放置在它既定的位置,這
種方式就是分層
該怎麼思考分層
分層的概念以了解,但是
實作上,常常不知道該怎
麼決定,那些要放在同
一層?
• 實作上,會先預定義一個初期的分層層數
• 當開始撰寫類別程式碼時,會依照它的功用/職責
來決定它應該放在哪一層
• 唯一準則就是”單一職責”,否則會導致混淆,不知道
該將類別放在哪一層
單一職責(SRP)
• 每一個類別都該只擁有一個職責
• 分層架構中的每一層都應該只擁有一個職責
• 類似工作的類別就應該放在同一個層中
分層架構範例(Sample)
• Presentation層: 處理所有介面展示以及與客戶(Client)
的互動
• Business層: 負責處理請求對應的業務
• Persistence層: 處理所有與資料庫層交互的工作
• Database層: 儲存物件狀態資訊的地方,可以是各種
存儲方案
封閉性(Closure)
• 每一層都是封閉的,因此,請求(Request)需要按順序從
Presentation層一路傳遞到Database層
• 層的封閉性保障了層與層之間的隔離性。
• 層的隔離性對於程式碼的可維護性是一大幫助
實務(Practice)
• 由Presentation層接收到客戶的請求,接著,它會委派
給一個元件;該元件可以找到Business層中可以
與之交互的元件
• 業務層在收到請求之後若有資料相關的操作需求,
它會創建Persistence層中相對應的元件
• Persistence層元件與Database層交互後的成果會回應
給Business層的元件;爾後,一路回覆給上層元件,直到
Presentation層
分層架構的層數
是要蓋摩天大樓!? 依系統的複雜度,
層數是極有可能
在未來被擴增的
分層架構的層數,沒
沒有數量上的限制
學為分層後的下一步(Next Step)
分層架構已經懂了,下一
步該學些什麼呢?
• 學會了分層架構之後,已經有了基本軟體架構的
基礎知識
• 下一步要學習是”硬體”方面的分層架構
分層架構-硬體(Hardware)
• 除了在軟體的部份有分層之外,硬體的部份也需要進行分層
• 硬體分層架構另一個常被使用的名詞-系統架構;主要由系統架構師負責設計
• 系統架構與軟體架構同樣重要,而且兩者在設計需要相互搭配
友善鏈結
系統架構的核心概念(Concept)
感覺起來和軟體分層很
相似,但是系統架構的
核心概念是什麼?
• 多層若以Multi-Layer,則意味著是在討論軟體方面
若是Multi-Tier,則意味著是在討論硬體方面
• 系統架構需要對作業系統、網路、安全、儲存體
有高度的瞭解與熟悉
• 架構師不僅要瞭解軟體架構,也得瞭解系統架構
常見的架構
有沒有那種架構是大家
常用的?
• 因為Web系統的流行,其中有一種架構最常
被開發人員所應用-MVC
• MVC這個架構由於常被使用,因此,在不同的
程式語言中有著各種不同MVC架構實現的
框架
(ASP.Net MVC, SpringMVC…)
名聞暇爾的MVC架構
• MVC是”前端”的架構設計
• MVC由三個主要的元件所構成:
• View
• Controller
• Model
• 妥善的職責分離,讓畫面的呈現變得更加有效率
MVC
意思是說,我全部
的系統都用MVC!?
MVC某些情境下並
不適合,因為,它是
前端架構
MVC是常被用到的
一種架構概念
適用性(Appropretely)
MVC是”前端”架構!?架構
還有分前後端?
• 每種架構都有其適用的地方,不能隨意亂套用
• MVC就是為了讓資料呈現有更好的表現而被
挖掘出來的
• 回想系統架構,那些負責資料/畫面呈現的系統
就可以考慮採用MVC架構進行開發
分層架構變化(Variance)
分層架構既然是基礎,那
麼它有什麼樣的變化呢?
• 分層架構在經過多位軟體開發人員使用過後
依照各自的經驗再發展出了多種不同的架構
• 系統開發免不了要與其它系統交互,而它並非
穩定,如何在這種情境下保障系統的穩定性
六角架構
• 六角架構的核心概念在於把外部系統連結的
部份通通隔離開來,並且採用調節器(Adaptor)
進行轉譯
• 六角架構帶來強烈的”變與不變”的架構思維;
將不易變動的核心部份封裝,將易變的部份
隔離,並且加上調節器轉譯,以避免模型概念的
污染
洋蔥架構
• 洋蔥架構是六角架構的進階,在設計的概念上
它承襲了六角架構的”變與不變”
• 與六角不同的地方在於洋蔥架構帶入了領域
層的概念
• 洋蔥架構認為領域層是需要維持不變的部份,
其餘部份都是外部易變的部份,需要被隔離
• 核心層部份只允許語言原生的功能,不得添加
外部套件
變與不變(Vulnerable)
這麼強調變與不變,原因
是什麼?
• 系統之間的整合本身就會存在風險,因此,
系統核心的部份一定要隔離開來,否則會一直受到
外部系統的變更而被迫跟著變更
• 核心部份的程式碼變更,其代價往往難以想像
架構的考量
有了變與不變,還有其他
的考量嗎?
• 架構的重點在於系統品質上的考量,而麻煩
的是,系統品質之間某些互有牴觸
• 架構師需要能夠依照現況來評估系統品質的
優先順序
系統品質矩陣
+: 增益
-: 減損
因品質而架構變異
有沒有那種經典的因為
品質因素而劇變的架構?
• CQRS算是當中的佼佼者
• CQRS是針對極端資源短缺的狀況下所衍生的
架構概念
CQRS
• 詢問不會改變問題的答案
• 將查詢與操作的處理進行拆分
• 應用在資源搶佔型系統
- 演唱會搶票
實現(Implement)
架構概念懂了,那該怎麼
實做各個層呢?
• 每個層的實做都有其方法論與框架可以參考
• 由於框架的豐富程度極高,因此,很多時候開發人員
專注會放在商業邏輯層
• 表現層- MVC框架的View, 或是SPA
• 應用層- MVC框架的Controller
• 資料存取層- Entity Framework
商業邏輯層的實現模式
• 在Martin Fowler先生的著作: PoEAA中,詳細剖析了
幾種商業邏輯層的實現方法:
• 交易腳本
• 表模組
• 領域模型-貧血模型
• 領域模型-富血模型
• 每一種實現方法都有其優點和缺點以及適用的場景
是PoEAA不是PPAP!
交易腳本(Transaction Script)
• 大多數的應用程式可以想像為一系列的交易。一個交易
可以查看以一定方式組織的訊息
• 每一個交易都有它自己的交易腳本,每一個交易腳本都是
一個類別的公有方法
• 每一個交易腳本都是採用程序導向的開發思維;處理來自
Presentation層的單一請求(Request)
交易腳本
那這樣幹嘛還要
另外三種!?
交易腳本適用在
簡單或是開發初期,
因為後期的程式碼
很難維護
交易腳本入門門檻
低,開發速度快
表模組(Table Module)
• 以一個類別來應對資料庫中的一張資料表、視圖(View)
• 除了屬性完整對映之外,還會有相關商業邏輯的處理
• 當系統功能越來越豐富後,可以發現到類別的方法變的
更多
表模組
有系統是非資料
導向的嗎!?
DDD的核心子域,
或是複雜度高的
系統,都不該是
資料導向開發
表模組直接貼近資
料表,適合資料導向
的系統
貧血模型(Anaemic domain model)
• 領域驅動所分析出來的模型,但是每個模型所對應的
類別僅只有getter/setter,而沒有商業邏輯的方法
• 通常與ORM的框架一起應用
• 實做上會將商業邏輯方法額外放在另一層(Service),而
這個服務層可能會採用交易腳本
貧血模型
聽哞!?
領域模型不是
E-R實體關聯模型,
因此,貧血模型仍
帶有領域概念
貧血模型雖不具方
法,但其仍表達部分
的領域概念
富血模型(Rich domain model)
• 富血模型的模式就與DDD中所定義的戰術技術一致了
• 每一個模型中的類別都擁有商業邏輯,並且會依照通
用語言的定義去實做
富血模型
講一堆模型、模型
的,那到底是啥!?
可以採用
交易樣式、
四色原型
來建構模型
富血模型是DDD最
推薦的商業邏輯層
開發模型
交易樣式(Transaction Pattern)
• 從某一個使用案例作為分析的項目
• 找出使用案例主要要處理的工作(Transaction)
• 該工作必有細項(Transaction-LineItem)
• 工作細項可能會使用到的額外物件及其描述
(Item, SpecificItem)
• 紀錄參與工作的人員和地點(Paticipant, Place)
友善鏈結
Participant Transaction
Place
Transaction
LineItem
Transaction
Subsequent
Transaction
交易樣式
• 客戶-訂購(Customer-Order)
• 客戶-銷售(Customer-Sale)
• 學生-註冊(Student-Register)
• 商店-銷售(Store-Sale)
• 飯店-訂房(Hotel-Reservation)
• 銷售-銷售細項(Sale-Sale LineItem)
• 訂購-訂購明細(Order-Order LineItem)
• 出貨-出貨明細(Shipment-Shipment LineItem)
SpecificItem Transaction
• 購物-付款(Shopping-Payment)
• 訂購-出貨(Order-Shipment)
SpecificItem LineItem
Item LineItem
Item SpecificItem
交易樣式
• 具體特定的收銀機-銷售(Specific-Register-Sale)
• 具體特定的銀行-存款(Specific-Bank-Deposit)
• 錄影帶-出租細項(VideoTape-Rental LineItem)
• 具體特定的產品-訂購細項(Specific-Product-Order LineItem
• 項目-交易細項(Item-LineItem)
• 項目-出貨細項(Item-Shipment LineItem)
SpecificItem Transaction
• 產品規格-產品(Product-Specification-Product)
• 影片型錄-錄影帶(Video-Description-Videotape)
四色原型(4-Colors Prototype)
• 以四種顏色描述不同的重要性:
• 紅色: 時間
• 綠色: 人、地、物
• 黃色: 角色
• 藍色: 描述
模型建構
這兩種差別在哪!? 交易腳本重在
行為,四色重在
時間與事件
交易樣式與四色原
型,這兩種方法可任
選一種
四種實現方式的分析(Analysis)
四種模式的好壞和使用
時機?
• 四種模式彼此沒有優劣,只有適用時機的差異
• 有些情境下甚至可以同時使用四種中的某幾個
• 四種模式在實現上有成本的差異,對於核心子領域
的限界上下文,建議採用富血模型
活動紀錄(Activity Record)
我還知道另一種方法,
叫做活動紀錄呦!
• 活動紀錄是表模組的變異版本;它是將資料表中
的一筆Record對應到一個類別
• 活動紀錄同樣也會將商業邏輯放在Record對應
的類別中
• 兩者同樣都犯了”God Object”的設計謬誤
其他架構
除了分層式架構之外,還
有什麼其它的嗎?
• 架構的分類可以粗略分為:
• 分層式
• 微核心
• 事件驅動
• 服務導向
• 響應式
微核心架構
• 又被稱之為”插件架構”;主要功能和業務邏輯都是透過
插件來實現
• 核心通常只包含系統可運行的最小功能
• 插件之間的通訊,應該盡可能降到最低,避免出現相互
依賴的問題
微核心架構
• 每個插件都不能彼此直接溝通,需要透過微核心進行
溝通
• 微核心不需要做太多事,只要專職在基礎的IPC
(Internal Processor Communication)
微核心的應用
微核心多半是應用在那
裡呢?
• 由於本身無法進行水平擴展,可與其它架構合併使用
或是應用在一些特定需求的元件上
• 需要新的業務功能可以直接開發一個新的插件
• 核心本身的開發具有一定難度,需要涉及到插件的
通訊、登記…等等,這些低階操作的處理
另一種思維(mind)
懂了分層架構和微核心
架構,還有其它令人驚奇
的架構嗎?
• 無論是分層架構或是微核心,兩者都是屬於同步型
資料處理,這在某些效能需求的情境下並不適合
• 非同步型的資料處理,最常見的手法即是以事件來
處理
事件驅動架構
• 屬分散式非同步架構的一種應用,具有高伸縮性和適應性
• 元件會在本身狀態變更之後,發布事件
• 具有兩種拓樸結構: Mediator / Broker
元件 事件5 事件4
事件1 事件2 事件3
元件
追加
讀取
發布給訂閱者
事件流
事件驅動架構-Mediator拓樸
• 由Mediator控制事件處理的流程,並且發送各種不同的
處理事件到指定的事件佇列中
• Mediator不會具有商業邏輯,只有流程邏輯
事件驅動架構-Broker拓樸
• 不具備Mediator;每個送出的事件都由可處理事件處理器
進行服務
• 適用在事件流相對簡單的情境下
事件V.S.紀錄(Log)
有差!? 事件是為了通知
訂閱者,紀錄是為了
開發者日後追蹤
事件不等於紀錄
事件溯源
曾聽說過事件溯源,這個
和事件驅動架構有關嗎?
• 事件溯源(Event Sourcing)是一種開發思維上的突破;
它將物件每次狀態的變化都紀錄下來
• 事件溯源具有能夠修復物件錯誤的狀態變更,或者是
回放物件的狀態變化
事件溯源(Event Sourcing)架構
• 每當物件的狀態改變時,都會產生出一個可追蹤的事件
• 系統會儲存每一個物件的事件到儲存體中
• 當系統重新取回物件時,會將其所有的事件取出並呼叫
物件的”狀態事件套用” 方法,讓其回復到最後一次狀態的
變更
物件 事件5 事件4 void Apply(IEvent e)
State.Mutate(IEvent e)
Changes.Add(IEvent e) 事件7 事件6
查詢狀態
事件驅動 & 事件溯源
這兩個似乎都與事件
有關,但是好混淆?
• 事件驅動架構更偏向是概念,而事件溯源是一種
實現的方式
• 事件驅動的描述會著重在如何將事件以非同步
的方式交由事件處理器進行處理
• 事件溯源著重是在以事件建構出物件,與原先的
事件驅動有些著重點上的差異
事件溯源的缺點與補強
事件溯源可以做到這麼
厲害的功能,它有沒有
什麼缺點?
• 事件溯源由於是將物件狀態的變化完整的紀錄
因此,其資料儲存的格式上較偏向”非正規化”
• 要想從事件溯源的探勘資料其實是非常困難的,
因為儲存的目地並非是為了這個項目
• 要想解決這個問題只能和其他架構結合-CQRS
CQRS與事件溯源
• Event Sourcing不利於製作報表,因此,
若能夠與CQRS配合,就能夠解決這個問題
• Command的部分採用事件溯源,而Query的
部分則採用不同的儲存格式
友善鏈結
服務導向
有沒有那種可以整合各
種不同系統的架構?
• 將系統視為一個個的服務
• 服務導向的架構兼容舊的系統與整合新的需求
服務導向架構(Service Orientation
Architecture)
• 採用”服務累增”的概念進行開發
• 服務依顆粒度進行分類;粗顆粒度的服務是採用
組合的方式進行開發
• 組合的資源有: 服務、流程、處理元件
企業服務總線(ESB)
• 可以使用ESB將各個不同的服務整合在一起
• 使用BPEL/BPMN定義業務流程,組成新的服務
• ESB可以提供服務的註冊和路由,並且讓各個服務
能夠以低耦合的方式進行整合
服務導向的問題
感覺SOA很完美,它是最終
的架構解決方案?
• 要開發服務導向的系統,需要所有團隊的成員都
瞭解SOA的核心精神與開發流程
• 服務的自治能力是很重要的,而不是單純地開發
一個曝露端點的Web服務
• 建構SOA是有著一定的複雜度,這樣的成本是否
低於它所帶來的優勢?這需要詳細思考
服務導向的再演化
SOA從推出到現在已經有
一段時間了,有再改善或
是演化嗎?
• SOA的複雜度是它最大的問題,只要最大限度的
降低複雜度,就能夠讓SOA更能夠讓人接受
• SOA的複雜度來自於兩者:
• 服務顆粒度難以掌握
• 以流程工具整合服務,以產生新的服務
微服務(MicroService)
• 微服務排除多層式架構的問題
• 每個服務都是最小且單一職責
• 每個服務都可以獨立部署
微服務 & SOA
微服務就是SOA的改進
版本嗎?如果不是,那他們
差在那裡?
• SOA是一種架構樣式,而微服務則是架構風格
(與RESTful概念相同,皆是一種架構風格)
• 微服務也是一種服務導向的思維,但是它並不
全然遵守SOA的所有規範
微服務的概念
• 每個服務都像是一個個的元件,每個元件都會
提供服務端口給彼此
• 由User Interface層進行服務的整合
• 若服務之間有很高的相依性,會影響到效能
單片式(Monolithic)與微服務
單片式是啥?為什麼講微
服務會提到它?
• 單片式多半意指將所有的功能和服務都實做在同一個
應用程式中,當系統不斷發展之後,會帶來許多惱人的
問題
• 微服務的概念與之相對立
單片式的問題
• 擴充:
• 當團隊想要擴充(Scale)系統,只能將全部服務都一齊擴充
• 提升:
• 底層框架(Framework)的升級可能會有問題;某些功能可能會出狀況
• 寄託在單一技術堆疊:
• 當已選擇某個技術堆疊進行開發,事後難以再改變
• 泥淖:
• 有發現任何設計上的錯誤,只能採用替代方案(Workaround)
微服務的真面目
微服務是一種分散式
系統?
• 微服務確實是一種分散式系統,因此,分散式系統
該有的問題,它全部都具備
• 微服務的導入要確認團隊對於分散式系統的認知
已經有一定的程度,否則反而會造成開發的困難
微服務的實務
• 每一個服務都是獨立的服務,彼此會採用既定
的協定進行溝通;常見是REST
• 由於服務數量多且有彼此溝通的需求,因此,複雜度
也由此而生
溝通方式
同步大致懂,非同步!? 非同步並不會在
等待回應的時候,
阻斷其他操作
不外乎是同步與
非同步之別
分散式系統溝通方法分析
One-to-One One-To-Many
同步 Request/Response -
非同步
Notification Publish/Subscribe
Request/Async Response Publish/Async Response
• 同步: 當Client發出API呼叫之後,在等待回覆期間會被阻斷其它操作
• 非同步: Client發出API呼叫之後,在等待回覆期間不會被阻斷其它操作
• One-to-One: 一個Request給指定的Service進行處理
• One-to-Many: 一個Request交給多個Service進行處理
• Notification: 射後不理
• Publish/Subscribe: 節點發出訊息通知訂閱該主題的其它節點
• Request/Response: Client發出請求,並期待服務的回覆
• Request/Async Response: 與Request/Response訊息交換模式相同,但是在等待服務的回覆時,
並不阻斷其它操作
綜合應用
服務探索
這麼多服務怎麼找到
那一個是我要的?
• 常用的策略是兩種角度切入:
• Client端
• Server端
• Client端的思維是去查詢服務註冊器,並且由Client
自行設計負載平衡演算法
• Server端的思維是製做一個Router;它可以協助Client
的Request找到它需要的服務
分散式交易
分散式要怎麼做到交易?
• 依照CAP理論,分散式系統要僅能做到保障其中
兩個項目
• 通常會放棄交易一致性,而改以使用”最終一致性”
作為補償
CAP理論
• Consistency代表資料一致性,也是資料庫交易最
在意的要素之一
• Availability代表使用者何時何地都能夠操作系統
• Partition Tolerance代表著在某些節點異常的狀況下
是否仍能夠正常地運作
• 大多數系統開發會傾向選擇AP,而一致性的部份
則採用最終一致性
擴展性不大
效能不高
一致性不穩
分散式交易-兩階段提交
友善鏈結
TC(交易協調器)
資料庫A 資料庫B
• 兩階段式提交是常見的分散式交易手法
• 缺點在於效能不佳,且需要一個交易協調器
分散式事件交易處理
如果是要符合CAP理論
而採用最終一致性,有
其他做法嗎?
• 若是能夠接受最終一致性,可以考慮採用事件驅動
的思維來解決問題
• 每個服務在完成自己本地的交易之後,發出事件給
其他服務;其他服務收到事件之後,也同樣進行本地
交易(可選擇採用非Request/Response模式)
• 使用中介元件管理(訊息斷路器)也是一種方案
訊息斷路器(Message Broker)
• 採用事件驅動的模式;利用一個中介元件-訊息斷路器
來協調兩個獨立的服務
• 服務一旦完成一個工作且需要其他服務接著操作時,
服務會發出事件給訊息斷路器;而訊息斷路器,會依照
商業流程去呼叫其他服務
• 服務與服務之間僅對訊息斷路器有依賴,而不會對其
它的服務有依賴
訂房
Svc
MB
客戶
Svc
Order Created
Order Created
Credit
Reserved
Credit Reserved
Credit Reserved
Update
Room
State
分散式系統的資料檢索
若說交易是資料的異動
處理,那麼查詢資料方面
分散式怎麼處理?
• 對於分散式系統來說,資料檢索也是一個難題:
• 如何一次性查詢多個服務的資料,再將資料
聚合(Aggregate)
實務探討(In Practice)
架構我都懂了,有沒有一
些實務例子呢?
• 架構並非是在第一手就設計出來,而是由不斷地
演化而成的
• 架構與業務兩者相輔相成;當無法滿足業務時,
技術就該進化,爾後業務就能夠再擴充,以此往復
循環
架構的初期設計
流量上升
機器由
一變成二
分流與冗餘
先擴展
應用伺服器
察覺到使用者的使用模式-
讀寫分離
讀寫分離
• 當運營一段時間之後,會發現應用程式已經無法
再優化,只能觀察資料存取模式來尋求優化之道
• 資料庫有讀取寫入上的比例差異,考量拆分資料庫
• 其實資料庫讀寫分離並無法改善得太顯著
(猜猜看為什麼?)
察覺到使用者的使用模式-
分流資料庫壓力
分庫分表
• 將資料庫的部分再度進行優化,進行分庫分表的動作
資料導向
資料導向!?
簡單的系統可以考
慮採用資料導向,但
缺點是太側重資料
庫系統資源
上面就是資料導向
系統的架構演進
怎麼從分析轉至架構設計
我已經全部了解架構,關
於分析到架構設計的過
程是甚麼?
• 從需求蒐集開始,接著採用DDD戰略分析系統
• 子領域、限界上下文,這些都是要先掌握的技術
• 有了限界上下文的整合概觀之後,就算是有了架構
的雛型版本了
第一步-分析出子領域和限界上下文
• 藉由DDD先分析出子領域
• 分析是否存在核心領域
• 針對每一個子領域都先分配一個限界上下文
第二步-整合所有限界上下文
• 分析各個限界上下文的關係
• 當所有限界上下文都能夠被整合之後,就算
是完成初步的架構雛形了
第三步-決定每個限界上下文的架構
• 除了核心領域的限界上下文建議採用DDD之外,
其他子領域的限界上下文可採用其他實作架構
• 最終由UI層整合所有的限界上下文系統
第四步-制定分層結構
• 定義各種不同功能的物件,其所處的層
最關鍵的一步-站在巨人的肩膀上
盡可能用現成的
第三方服務!
不要自己寫
下一步?
再來是不是就要進入
DDD的戰術技術了?
• 接下來就是下卷要討論的DDD戰術技術
• 在戰術技術中將逐一討論各個項目的實作
• 要注意架構需要隨時重新審視並且調整
回顧
• 分層架構-
• 軟體分層架構(Multi-Layer)
• 硬體分層架構(Multi-Tier)
• 架構有其適用的場景,不能隨意套用
• 微核心架構擴充性高,但不利於擴展
• 事件驅動的擴充高,但學習門檻高
• 事件不等於紀錄(Log)
• 事件溯源是一種事件驅動的實現
• 架構是演化而來的,不是設計來的
• 由DDD分析取得架構雛形;再決定用使用哪一種
架構來實作

More Related Content

What's hot

マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ増田 亨
 
DDD + Clean Architecture: 從需求到實作
DDD + Clean Architecture: 從需求到實作DDD + Clean Architecture: 從需求到實作
DDD + Clean Architecture: 從需求到實作teddysoft
 
マイクロサービスに至る歴史とこれから - XP祭り2021
マイクロサービスに至る歴史とこれから - XP祭り2021マイクロサービスに至る歴史とこれから - XP祭り2021
マイクロサービスに至る歴史とこれから - XP祭り2021Yusuke Suzuki
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven DesignRyan Riley
 
實踐 Clean Architecture(實作高可用性的軟件架構)
實踐 Clean Architecture(實作高可用性的軟件架構)實踐 Clean Architecture(實作高可用性的軟件架構)
實踐 Clean Architecture(實作高可用性的軟件架構)Gelis Wu
 
Real Life Clean Architecture
Real Life Clean ArchitectureReal Life Clean Architecture
Real Life Clean ArchitectureMattia Battiston
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計Tadayoshi Sato
 
Microservices, Containers, Kubernetes, Kafka, Kanban
Microservices, Containers, Kubernetes, Kafka, KanbanMicroservices, Containers, Kubernetes, Kafka, Kanban
Microservices, Containers, Kubernetes, Kafka, KanbanAraf Karsh Hamid
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかKoichiro Matsuoka
 
ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善増田 亨
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)Yoshitaka Kawashima
 
Domain Driven Design Introduction
Domain Driven Design IntroductionDomain Driven Design Introduction
Domain Driven Design Introductionwojtek_s
 
マイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karateマイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with KarateTakanori Suzuki
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
 
ログ解析を支えるNoSQLの技術
ログ解析を支えるNoSQLの技術ログ解析を支えるNoSQLの技術
ログ解析を支えるNoSQLの技術Drecom Co., Ltd.
 
われわれはなぜアジャイルに向かうのか
われわれはなぜアジャイルに向かうのかわれわれはなぜアジャイルに向かうのか
われわれはなぜアジャイルに向かうのかtoshihiro ichitani
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven DesignAndriy Buday
 
A5 SQL Mk-2の便利な機能をお教えします
A5 SQL Mk-2の便利な機能をお教えしますA5 SQL Mk-2の便利な機能をお教えします
A5 SQL Mk-2の便利な機能をお教えしますester41
 

What's hot (20)

マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
DDD + Clean Architecture: 從需求到實作
DDD + Clean Architecture: 從需求到實作DDD + Clean Architecture: 從需求到實作
DDD + Clean Architecture: 從需求到實作
 
マイクロサービスに至る歴史とこれから - XP祭り2021
マイクロサービスに至る歴史とこれから - XP祭り2021マイクロサービスに至る歴史とこれから - XP祭り2021
マイクロサービスに至る歴史とこれから - XP祭り2021
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
實踐 Clean Architecture(實作高可用性的軟件架構)
實踐 Clean Architecture(實作高可用性的軟件架構)實踐 Clean Architecture(實作高可用性的軟件架構)
實踐 Clean Architecture(實作高可用性的軟件架構)
 
Real Life Clean Architecture
Real Life Clean ArchitectureReal Life Clean Architecture
Real Life Clean Architecture
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Microservices, Containers, Kubernetes, Kafka, Kanban
Microservices, Containers, Kubernetes, Kafka, KanbanMicroservices, Containers, Kubernetes, Kafka, Kanban
Microservices, Containers, Kubernetes, Kafka, Kanban
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
 
Domain Driven Design Introduction
Domain Driven Design IntroductionDomain Driven Design Introduction
Domain Driven Design Introduction
 
マイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karateマイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karate
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
Domain driven design
Domain driven designDomain driven design
Domain driven design
 
ログ解析を支えるNoSQLの技術
ログ解析を支えるNoSQLの技術ログ解析を支えるNoSQLの技術
ログ解析を支えるNoSQLの技術
 
われわれはなぜアジャイルに向かうのか
われわれはなぜアジャイルに向かうのかわれわれはなぜアジャイルに向かうのか
われわれはなぜアジャイルに向かうのか
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven Design
 
A5 SQL Mk-2の便利な機能をお教えします
A5 SQL Mk-2の便利な機能をお教えしますA5 SQL Mk-2の便利な機能をお教えします
A5 SQL Mk-2の便利な機能をお教えします
 

Similar to DDD架構設計

2020 11-27 Taiwan DDD Conference
2020 11-27 Taiwan DDD Conference2020 11-27 Taiwan DDD Conference
2020 11-27 Taiwan DDD ConferenceGuan-Rong Huang
 
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Justin Lin
 
無瑕的程式碼 Clean Code 心得分享
無瑕的程式碼 Clean Code 心得分享無瑕的程式碼 Clean Code 心得分享
無瑕的程式碼 Clean Code 心得分享Win Yu
 
FreeTalk: 企業資安下之工程師成長歷程
 FreeTalk: 企業資安下之工程師成長歷程 FreeTalk: 企業資安下之工程師成長歷程
FreeTalk: 企業資安下之工程師成長歷程loyo
 
Nb的敏捷
Nb的敏捷Nb的敏捷
Nb的敏捷oulan
 
DDD系統分析
DDD系統分析DDD系統分析
DDD系統分析國昭 張
 
架構設計-資料存取的選擇
架構設計-資料存取的選擇架構設計-資料存取的選擇
架構設計-資料存取的選擇國昭 張
 
選一個框架當好朋友,讓您成為開心攻城獅
選一個框架當好朋友,讓您成為開心攻城獅選一個框架當好朋友,讓您成為開心攻城獅
選一個框架當好朋友,讓您成為開心攻城獅Shengyou Fan
 
Geo science cafe 如何找到一份满意的工作
Geo science cafe 如何找到一份满意的工作Geo science cafe 如何找到一份满意的工作
Geo science cafe 如何找到一份满意的工作kewuc
 
給開發人員的資料庫效能建議
給開發人員的資料庫效能建議給開發人員的資料庫效能建議
給開發人員的資料庫效能建議Rico Chen
 
Djt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.comDjt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.comdrewz lin
 
Djt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.comDjt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.comdrewz lin
 
From Coders to Builders of the Intelligent World
From Coders to Builders of the Intelligent WorldFrom Coders to Builders of the Intelligent World
From Coders to Builders of the Intelligent WorldHuawei Technologies
 
DevOps的神鬼奇航
DevOps的神鬼奇航DevOps的神鬼奇航
DevOps的神鬼奇航Edward Kuo
 
從乙方PM的角度看敏捷
從乙方PM的角度看敏捷從乙方PM的角度看敏捷
從乙方PM的角度看敏捷KC Liu
 
Microsoft recommendation solution on azure
Microsoft recommendation solution on azureMicrosoft recommendation solution on azure
Microsoft recommendation solution on azureDuran Hsieh
 
Ddd(meetup 2) ddd with clean architecture
Ddd(meetup 2) ddd with clean architectureDdd(meetup 2) ddd with clean architecture
Ddd(meetup 2) ddd with clean architecture國昭 張
 

Similar to DDD架構設計 (20)

2020 11-27 Taiwan DDD Conference
2020 11-27 Taiwan DDD Conference2020 11-27 Taiwan DDD Conference
2020 11-27 Taiwan DDD Conference
 
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
 
無瑕的程式碼 Clean Code 心得分享
無瑕的程式碼 Clean Code 心得分享無瑕的程式碼 Clean Code 心得分享
無瑕的程式碼 Clean Code 心得分享
 
FreeTalk: 企業資安下之工程師成長歷程
 FreeTalk: 企業資安下之工程師成長歷程 FreeTalk: 企業資安下之工程師成長歷程
FreeTalk: 企業資安下之工程師成長歷程
 
Nb的敏捷
Nb的敏捷Nb的敏捷
Nb的敏捷
 
DDD系統分析
DDD系統分析DDD系統分析
DDD系統分析
 
架構設計-資料存取的選擇
架構設計-資料存取的選擇架構設計-資料存取的選擇
架構設計-資料存取的選擇
 
選一個框架當好朋友,讓您成為開心攻城獅
選一個框架當好朋友,讓您成為開心攻城獅選一個框架當好朋友,讓您成為開心攻城獅
選一個框架當好朋友,讓您成為開心攻城獅
 
Nb的敏捷
Nb的敏捷Nb的敏捷
Nb的敏捷
 
Geo science cafe 如何找到一份满意的工作
Geo science cafe 如何找到一份满意的工作Geo science cafe 如何找到一份满意的工作
Geo science cafe 如何找到一份满意的工作
 
給開發人員的資料庫效能建議
給開發人員的資料庫效能建議給開發人員的資料庫效能建議
給開發人員的資料庫效能建議
 
Djt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.comDjt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.com
 
Djt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.comDjt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.com
 
From Coders to Builders of the Intelligent World
From Coders to Builders of the Intelligent WorldFrom Coders to Builders of the Intelligent World
From Coders to Builders of the Intelligent World
 
DevOps的神鬼奇航
DevOps的神鬼奇航DevOps的神鬼奇航
DevOps的神鬼奇航
 
從乙方PM的角度看敏捷
從乙方PM的角度看敏捷從乙方PM的角度看敏捷
從乙方PM的角度看敏捷
 
溝通與要求
溝通與要求溝通與要求
溝通與要求
 
Microsoft recommendation solution on azure
Microsoft recommendation solution on azureMicrosoft recommendation solution on azure
Microsoft recommendation solution on azure
 
Ddd(meetup 2) ddd with clean architecture
Ddd(meetup 2) ddd with clean architectureDdd(meetup 2) ddd with clean architecture
Ddd(meetup 2) ddd with clean architecture
 
Ch03
Ch03Ch03
Ch03
 

More from 國昭 張

8th ddd taiwan study group bounded context integration
8th ddd taiwan study group  bounded context integration8th ddd taiwan study group  bounded context integration
8th ddd taiwan study group bounded context integration國昭 張
 
20190126 ddd-meetup1
20190126 ddd-meetup120190126 ddd-meetup1
20190126 ddd-meetup1國昭 張
 
事件風暴-設計衝刺
事件風暴-設計衝刺事件風暴-設計衝刺
事件風暴-設計衝刺國昭 張
 
Scrum essential
Scrum essentialScrum essential
Scrum essential國昭 張
 
Docker進階探討
Docker進階探討Docker進階探討
Docker進階探討國昭 張
 
Asp.net core v1.0
Asp.net core v1.0Asp.net core v1.0
Asp.net core v1.0國昭 張
 
Redux+react js
Redux+react jsRedux+react js
Redux+react js國昭 張
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具國昭 張
 
例外處理與單元測試
例外處理與單元測試例外處理與單元測試
例外處理與單元測試國昭 張
 
ASP.Net WebAPI經驗分享
ASP.Net WebAPI經驗分享ASP.Net WebAPI經驗分享
ASP.Net WebAPI經驗分享國昭 張
 
ASP.Net MVC Framework
ASP.Net MVC FrameworkASP.Net MVC Framework
ASP.Net MVC Framework國昭 張
 
Team Foundation Server
Team Foundation ServerTeam Foundation Server
Team Foundation Server國昭 張
 
SQL Server效能調校
SQL Server效能調校SQL Server效能調校
SQL Server效能調校國昭 張
 

More from 國昭 張 (20)

8th ddd taiwan study group bounded context integration
8th ddd taiwan study group  bounded context integration8th ddd taiwan study group  bounded context integration
8th ddd taiwan study group bounded context integration
 
20190126 ddd-meetup1
20190126 ddd-meetup120190126 ddd-meetup1
20190126 ddd-meetup1
 
事件風暴-設計衝刺
事件風暴-設計衝刺事件風暴-設計衝刺
事件風暴-設計衝刺
 
單元測試
單元測試單元測試
單元測試
 
Docker實務
Docker實務Docker實務
Docker實務
 
Scrum essential
Scrum essentialScrum essential
Scrum essential
 
Docker進階探討
Docker進階探討Docker進階探討
Docker進階探討
 
Vue
VueVue
Vue
 
Docker基礎
Docker基礎Docker基礎
Docker基礎
 
DDD引導
DDD引導DDD引導
DDD引導
 
前端測試
前端測試前端測試
前端測試
 
Asp.net core v1.0
Asp.net core v1.0Asp.net core v1.0
Asp.net core v1.0
 
Redux+react js
Redux+react jsRedux+react js
Redux+react js
 
React js
React jsReact js
React js
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具
 
例外處理與單元測試
例外處理與單元測試例外處理與單元測試
例外處理與單元測試
 
ASP.Net WebAPI經驗分享
ASP.Net WebAPI經驗分享ASP.Net WebAPI經驗分享
ASP.Net WebAPI經驗分享
 
ASP.Net MVC Framework
ASP.Net MVC FrameworkASP.Net MVC Framework
ASP.Net MVC Framework
 
Team Foundation Server
Team Foundation ServerTeam Foundation Server
Team Foundation Server
 
SQL Server效能調校
SQL Server效能調校SQL Server效能調校
SQL Server效能調校
 

DDD架構設計