如果你要設計一個(gè)分布式系統,它可能是基于微服務(wù)的,并且你在考慮采用 事件架構(Event Architecture),那么目前存在多種模型和技術(shù)可供使用。
David Dawson 近期在博客中介紹了多種類(lèi)型的事件架構,并指出:非功能性需求是影響架構選擇的一個(gè)主要因素。
http://daviddawson.me/blog/2017/07/10/styles-of-event-architecture.html
Dawson 是一位自由職業(yè)的系統架構師,他將事件架構簡(jiǎn)單地定義為一種基于事件的軟件架構。鑒于事件也是數據模型的一部分,因此事件架構也是一種數據架構。他強調,事件架構并非定義服務(wù)交互方式的一系列技術(shù)或特定模型。
分階段事件驅動(dòng)架構(SEDA,Staged Event-Driven Architecture)是一種簡(jiǎn)單并很好確立的模型。
SEDA 本質(zhì)上是一個(gè)工作流過(guò)程,其中各個(gè)組件根據自身的處理情況發(fā)出事件去驅動(dòng)整個(gè)過(guò)程,而事件通常使用某種消息總線(xiàn)進(jìn)行傳輸。
Dawson 指出,SEDA 模型的一個(gè)重要問(wèn)題是事件的生存期很短,因而在會(huì )在傳輸或組件離線(xiàn)過(guò)程中丟失。因此與其讓系統采納最終一致性,不如實(shí)現一種 Dawson 所稱(chēng)的“期許一致性”(Hopeful Consistency)。
只要所有組件工作正常,系統就是一致的。一旦有組件崩潰,那么最終將會(huì )得到不一致的系統,這時(shí)必須做手工恢復去回到一致性狀態(tài)。Dawson 稱(chēng)其為“面向實(shí)體的微服務(wù)”,并強烈建議不要采納這種架構。
為重建一致性狀態(tài),Dawson 給出的最優(yōu)解決方案是將事件看作是一種數據,并持久化事件流。這樣我們就可以在任一時(shí)刻重放(Replay)流以恢復狀態(tài),并且借助此得到真正的最終一致性系統。從中我們還可以得到其它一些優(yōu)點(diǎn),例如可以對同一事件流給出多個(gè)視圖。
從 Dawson 的經(jīng)驗來(lái)看,盡管通常稱(chēng)持久化事件流為“事件溯源”,但是他堅信這并非正確的,因為它不是去重建一個(gè)實(shí)體的狀態(tài),而是對不受限實(shí)體集創(chuàng )建視圖。
鑒于此,他更愿意稱(chēng)其為“類(lèi)型流處理”(Style Stream Processing)。他認為 Kafka 正是使用了這樣的架構。Kafka 客戶(hù)按流的順序依次讀取事件,但在重放事件時(shí)可以從頭開(kāi)始,或是從所需的特定事件處開(kāi)始。
用 DDD 的術(shù)語(yǔ)解釋?zhuān)酆希╝ggregate)是 處于一致性范疇內的一系列實(shí)體。通過(guò)對一個(gè)聚合的所有更改發(fā)出和持久化事件,并通過(guò)重放而獲取的同一事件而構建同一聚合的狀態(tài),我們可以得到經(jīng)事件溯源的聚合根,Dawson 稱(chēng)其為“真實(shí)事件溯源”。
Daswon 指出,具有 獨立單一事件流 在重建聚合過(guò)程中是非常重要的。對于創(chuàng )建視圖等其它一些需求,必須要創(chuàng )建獨立的流。
為輔助構建基于事件架構模型的系統,Dawson 創(chuàng )建了 Muon Stack 項目。
https://github.com/muoncore/stack-event
它是一系列面向消息和事件的軟件庫和服務(wù),用于構建分布式系統。其中包括了一個(gè)事件流 API 客戶(hù)端,以及一個(gè)名為“Photon”的事件存儲。目前他正致力于構建 Muon Stack 對 Kafka 的接口。
https://www.infoq.com/news/2017/08/selecting-event-architecture
點(diǎn)擊下方圖片即可閱讀
沈劍聊微服務(wù):先做好你的服務(wù)拆分
聯(lián)系客服