事件驅(qū)動(dòng)架構(gòu)是一種常見的軟件架構(gòu)設(shè)計(jì)方法,對(duì)事件驅(qū)動(dòng)系統(tǒng)而言,事件的產(chǎn)生、通信、捕獲、處理和持久保留是解決方案的核心結(jié)構(gòu)。事件驅(qū)動(dòng)架構(gòu)不受具體編程語(yǔ)言的限制,可以最大程度的降低耦合度,因此在現(xiàn)在分布式架構(gòu)中應(yīng)用廣泛。
案例
比如電商中的訂單系統(tǒng)關(guān)于訂單的狀態(tài)變化,新建,支付,發(fā)貨,取件等,如果由訂單系統(tǒng)去調(diào)用其他系統(tǒng),會(huì)給訂單系統(tǒng)帶來非常高的成本,理想的方式是所有的訂單狀態(tài)變化都發(fā)送一個(gè)消息,感興趣的業(yè)務(wù)下游消費(fèi)此消息進(jìn)行業(yè)務(wù)邏輯處理。
如下圖,理論上訂單系統(tǒng)只需要寫一份消息,如果有新的業(yè)務(wù)需要使用訂單消息進(jìn)行消費(fèi)即可,可以寫一份新的代碼而不用修改任何老代碼。

常見事件驅(qū)動(dòng)架構(gòu)模型
發(fā)布/訂閱模型
這是一種基于事件流訂閱的消息傳遞基礎(chǔ)架構(gòu)。對(duì)于該模型而言,在事件發(fā)生或公布之后,系統(tǒng)會(huì)將相應(yīng)的消息發(fā)送給需要通知的訂閱用戶。
事件流模型
借助事件流模型,事件將被寫入日志,事件使用者無需訂閱事件流。相反,它們可以從流的任何部分讀取并隨時(shí)加入流。
事件流有幾種不同的類型:
事件流處理使用諸如 Apache Kafka 等數(shù)據(jù)流平臺(tái)來提取事件并處理或轉(zhuǎn)換事件流。事件流處理可用于檢測(cè)事件流中有用的模式。
簡(jiǎn)單事件處理是指事件立即在事件使用者中觸發(fā)操作。
復(fù)雜事件處理則需要事件使用者處理一系列事件以檢測(cè)模式。
事件驅(qū)動(dòng)模型的優(yōu)勢(shì)
異步:內(nèi)部的組件不需要知道之前發(fā)生了什么,接下來發(fā)生什么,只需要關(guān)注處理各自的事件即可。
松耦合,服務(wù)不需要(也不應(yīng)該)知道或依賴于其他服務(wù)。
易擴(kuò)展:
擴(kuò)展現(xiàn)有服務(wù):由于服務(wù)在事件驅(qū)動(dòng)的體系結(jié)構(gòu)下解耦,而且服務(wù)通常只執(zhí)行一項(xiàng)任務(wù),因此跟蹤特定服務(wù)的進(jìn)行擴(kuò)展變得很容易。
擴(kuò)展新服務(wù):只需要新增一個(gè)消費(fèi)者即可,可隨時(shí)自由的添加
恢復(fù)支持:帶有隊(duì)列的事件驅(qū)動(dòng)架構(gòu)可以通過“重播”過去的事件來恢復(fù)丟失的工作。當(dāng)用戶需要恢復(fù)時(shí),這對(duì)于防止數(shù)據(jù)丟失非常有用。
考慮事件模型一些注意事項(xiàng)
事件太多:消息量過大的話,可能一些小服務(wù)無法消費(fèi)完,從而堆積甚至被消息打掛掉。
通用事件:過于通用的東西一般相當(dāng)于沒有這個(gè)東西,最好還是定義事件的規(guī)范,不同的事件要進(jìn)行區(qū)分。
業(yè)務(wù)量級(jí):當(dāng)應(yīng)用體量還比較小的時(shí)候,可以考慮傳統(tǒng)的模式即可,如果直接引入事件驅(qū)動(dòng)架構(gòu)會(huì)增加復(fù)雜度,增加成本。
為什么可以提高擴(kuò)展性?
當(dāng)擴(kuò)展現(xiàn)有服務(wù)的時(shí)候,由于各自模塊是解耦的,彼此不直接感知,因此對(duì)現(xiàn)有的服務(wù)直接進(jìn)行擴(kuò)容很簡(jiǎn)單。
當(dāng)增加新的服務(wù)的時(shí)候,無需考慮其他服務(wù)和系統(tǒng),只需要關(guān)注新服務(wù)邏輯以及事件本身即可,沒有依賴,因此可以直接使用。