例如購(gòu)買一只股票,首先會(huì)校驗(yàn)這個(gè)交易,校驗(yàn)股票交易是否符合各種規(guī)定,將它交給一個(gè)經(jīng)紀(jì)人,計(jì)算傭金,最后確認(rèn)交易。所有這些都安排好各個(gè)步驟的順序,決定它們是否串行還是并行。
它包括四個(gè)組件:event queues, an event mediator, event channels 和 event processors。

事件流是這樣開(kāi)始的: 客戶端發(fā)送一個(gè)事件到事件隊(duì)列(event queues)中,它用來(lái)將事件傳送給event mediator。Event mediator收到初始的事件后,會(huì)發(fā)送額外的一些異步事件給event channels來(lái)執(zhí)行處理的每個(gè)步驟。Event processors監(jiān)聽(tīng)event channels,接收事件并處理一些業(yè)務(wù)邏輯。
在事件驅(qū)動(dòng)架構(gòu)中有十幾個(gè)甚至幾百個(gè)事件隊(duì)列都很正常。模式本身沒(méi)有限定事件隊(duì)列的實(shí)現(xiàn)方式。它可能是一個(gè)消息隊(duì)列,一個(gè)web service或者其它。
這里有兩種事件:初始事件和處理事件。Mediator會(huì)將初始事件編排成處理事件。它沒(méi)有具體的業(yè)務(wù)邏輯,只是一個(gè)協(xié)調(diào)者,負(fù)責(zé)將初始事件轉(zhuǎn)化成一個(gè)或者多個(gè)處理事件。
event channels 既可以是消息隊(duì)列,也可以是消息topic,大部分是消息topic,這樣可以由多個(gè)消息處理器(event processor)處理同一個(gè)消息。
消息處理器包含實(shí)際的業(yè)務(wù)邏輯。每個(gè)消息處理器都是自包含的,獨(dú)立的,高度解耦的,執(zhí)行單一的任務(wù)。
這種模式可能有一些變種。作為架構(gòu)師,你應(yīng)該理解每個(gè)實(shí)現(xiàn)的細(xì)節(jié),確保這種解決方案適合你的需求。
有一些開(kāi)源的框架實(shí)現(xiàn)了這種架構(gòu),如Spring Integration, Apache Camel, 或者 Mule ESB。
Broker拓?fù)浼軜?gòu)
Broker不同于上面的結(jié)構(gòu),它沒(méi)有中心的Mediator。所有的事件串聯(lián)起來(lái)通過(guò)一個(gè)輕量級(jí)的消息broker如RabbitMQ,ActiveMQ,HornetQ等。如果你的消息比較簡(jiǎn)單,不需要重新編排,就可以使用這種結(jié)構(gòu)。

如圖所示,它包含兩個(gè)組件broker和 event processor。
broker中的event channel可以是消息隊(duì)列,消息topic或者它們的復(fù)合形式。
每個(gè)event processor負(fù)責(zé)處理事件,發(fā)布新的事件。

架構(gòu)例子
在新浪微薄的早期架構(gòu)中,微薄發(fā)布使用同步推模式,用戶發(fā)表微薄后系統(tǒng)會(huì)立即將這條微薄插入到數(shù)據(jù)庫(kù)所有粉絲的訂閱列表中,當(dāng)用戶量比較大時(shí),特別是明星用戶發(fā)布微博時(shí),會(huì)引起大量的數(shù)據(jù)庫(kù)寫操作,超出數(shù)據(jù)庫(kù)負(fù)載,系統(tǒng)性能急劇下降,用戶響應(yīng)延遲加劇。后來(lái)新浪微薄改用異步推拉結(jié)合的模式,用戶發(fā)表微薄后系統(tǒng)將微薄寫入消息隊(duì)列后立即返回,用戶響應(yīng)迅速,消息隊(duì)列消費(fèi)者任務(wù)將微薄推送給所有當(dāng)前在線粉絲的訂閱列表中,非在線用戶登錄后再根據(jù)關(guān)注列表拉取微薄訂閱列表。
架構(gòu)考量
事件驅(qū)動(dòng)架構(gòu)模式實(shí)現(xiàn)起來(lái)相對(duì)復(fù)雜,主要是由于它的異步和分布式特性。這可能會(huì)帶來(lái)一些分布式的問(wèn)題,比如遠(yuǎn)程處理的可用性,缺乏響應(yīng),broker重連等問(wèn)題。
一個(gè)考慮是這種模式對(duì)于單一的邏輯缺乏原子事務(wù)。所以你需要將原子事務(wù)交給一個(gè)事件處理器執(zhí)行,跨事件處理器的原子事務(wù)是很困難的。
最困難的設(shè)計(jì)之一是事件處理器的創(chuàng)建,維護(hù)和管理。事件通常有特殊的約定(數(shù)據(jù)值和格式)。
模式分析
總體靈活性: 高
發(fā)布易用性: 高
可測(cè)試性: 低
性能: 高
規(guī)模擴(kuò)展性: 高
開(kāi)發(fā)容易度: 低