掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
在當(dāng)今的軟件領(lǐng)域中,做出正確的架構(gòu)決策對(duì)于確保性能、可擴(kuò)展性、可維護(hù)性和整體成功至關(guān)重要。在眾多模式中,事件驅(qū)動(dòng)架構(gòu)(EDA)和事件溯源(ES)作為復(fù)雜軟件系統(tǒng)最受歡迎的兩種選擇之一。雖然可以單獨(dú)使用EDA或ES,但它們的結(jié)合可能效果驚人。

專業(yè)從事企業(yè)網(wǎng)站建設(shè)和網(wǎng)站設(shè)計(jì)服務(wù),包括網(wǎng)站建設(shè)、申請(qǐng)域名、雅安服務(wù)器托管、企業(yè)郵箱、微信公眾號(hào)開(kāi)發(fā)、微信支付寶微信小程序定制開(kāi)發(fā)、重慶App定制開(kāi)發(fā)、軟件開(kāi)發(fā)、等服務(wù)。公司始終通過(guò)不懈的努力和以更高的目標(biāo)來(lái)要求自己,在不斷完善自身管理模式和提高技術(shù)研發(fā)能力的同時(shí),大力倡導(dǎo)推行新經(jīng)濟(jì)品牌戰(zhàn)略,促進(jìn)互聯(lián)網(wǎng)事業(yè)的發(fā)展。
事件驅(qū)動(dòng)架構(gòu)與傳統(tǒng)的請(qǐng)求驅(qū)動(dòng)系統(tǒng)相對(duì)立,傳統(tǒng)系統(tǒng)中組件通過(guò)緊密耦合的方式顯式調(diào)用彼此的方法或直接使用同步的API調(diào)用。在事件驅(qū)動(dòng)架構(gòu)中,組件通過(guò)事件間接通信,松耦合,促進(jìn)靈活性、可擴(kuò)展性和模塊化。
事件溯源,另一個(gè)強(qiáng)大的設(shè)計(jì)模式也利用事件,強(qiáng)調(diào)維護(hù)事件的時(shí)間順序記錄,以實(shí)現(xiàn)更好的審計(jì)、分析和歷史跟蹤。事件溯源的主要理念是最終一致性。
讓我們來(lái)詳細(xì)了解它們,并看看如何將它們結(jié)合起來(lái),構(gòu)建一個(gè)適合我們使用案例的可擴(kuò)展架構(gòu),有效服務(wù)數(shù)百萬(wàn)客戶來(lái)自數(shù)千商家。
事件驅(qū)動(dòng)架構(gòu)關(guān)注系統(tǒng)中事件的流動(dòng)和處理。事件代表重要的事件或狀態(tài)變化,在不同組件之間通信的骨干。在事件驅(qū)動(dòng)系統(tǒng)中,組件(如微服務(wù)或函數(shù))通過(guò)生成、檢測(cè)和消費(fèi)事件進(jìn)行異步通信。這種方法促進(jìn)了松耦合,允許靈活性、可擴(kuò)展性,并對(duì)動(dòng)態(tài)變化作出響應(yīng)。EDA特別適用于分布式系統(tǒng),在這些系統(tǒng)中,組件可以獨(dú)立操作,在無(wú)需直接同步交互的情況下實(shí)時(shí)對(duì)事件做出反應(yīng)。
EDA的常見(jiàn)使用案例:
通過(guò)消息代理實(shí)現(xiàn)可擴(kuò)展的異步處理
在任務(wù)數(shù)量龐大且具有異步處理靈活性的場(chǎng)景中,此配置極具擴(kuò)展性。在服務(wù)A中,組件X生成消息,并將其發(fā)布到消息代理(即事件代理)。隨后,這些消息根據(jù)需要被許多消費(fèi)者(稱為工作器)訂閱和處理。事件的來(lái)源可能包括cron作業(yè)、用戶交互和類似來(lái)源。
在傳統(tǒng)系統(tǒng)中,任務(wù)通常按順序處理,或者在支持的堆棧中通過(guò)多線程支持。然而,即使有多線程支持,只有垂直擴(kuò)展是可行的選項(xiàng)。
消息隊(duì)列
這是上述異步處理的一種變體,但是工作器現(xiàn)在位于另一個(gè)服務(wù)中。這使得服務(wù)B能夠在事件數(shù)量增加時(shí)無(wú)縫擴(kuò)展。到達(dá)服務(wù)B的事件可能來(lái)自不同的服務(wù)。
這可用于由服務(wù)B負(fù)責(zé)同時(shí)處理大量小任務(wù)的體系結(jié)構(gòu),例如向移動(dòng)設(shè)備提供大量推送通知或短信通知。
這是EDA的更高級(jí)版本,系統(tǒng)的多個(gè)組件可能對(duì)同一消息感興趣,也可能不感興趣。因此,復(fù)雜性更多地在代理端,事件通過(guò)不同的綁定路由到不同的服務(wù)。
跨領(lǐng)域通信
上圖展示了一個(gè)示例設(shè)置,其中服務(wù)A的事件通過(guò)不同的隊(duì)列路由到服務(wù)B和C。請(qǐng)注意,我在這里使用了RabbitMQ的術(shù)語(yǔ):聯(lián)邦、交換和虛擬主機(jī)。但是,這個(gè)設(shè)置也可以使用其他消息代理來(lái)完成。
在傳統(tǒng)的以數(shù)據(jù)庫(kù)為中心的方法中,我們通常存儲(chǔ)實(shí)體的當(dāng)前狀態(tài)。相比之下,事件溯源將焦點(diǎn)從存儲(chǔ)應(yīng)用程序的當(dāng)前狀態(tài)轉(zhuǎn)移到捕獲并存儲(chǔ)對(duì)該狀態(tài)的更改的一系列不可變事件。這些事件表示系統(tǒng)中特定的事件或事務(wù),并存儲(chǔ)在事件日志或事件存儲(chǔ)中。
很多情況下,事件溯源與CQRS結(jié)合使用。這將讀模型(查詢模型)和寫模型(命令模型)分開(kāi),以實(shí)現(xiàn)關(guān)注點(diǎn)的分離。在此結(jié)合時(shí),還有兩個(gè)事件溯源的重要概念:
專門用于查詢和呈現(xiàn)數(shù)據(jù)的模型。它對(duì)讀取操作進(jìn)行了優(yōu)化,并根據(jù)寫模型生成的事件構(gòu)建。讀模型是去規(guī)范化的,并根據(jù)其服務(wù)的查詢需求定制。從相同的事件源,可以構(gòu)建不同視圖的讀模型,為業(yè)務(wù)領(lǐng)域提供不同的視角。
根據(jù)事件存儲(chǔ)中存儲(chǔ)的事件轉(zhuǎn)換和更新讀模型的過(guò)程。
事件溯源與CQRS
在此設(shè)置中,事件被填充以記錄由業(yè)務(wù)流程引起的聚合的每個(gè)狀態(tài),并存儲(chǔ)在事件存儲(chǔ)中。隨后,投影從事件存儲(chǔ)中檢索這些事件,并開(kāi)始將它們轉(zhuǎn)換為各種讀表。這些表可以以不同的視圖呈現(xiàn),為業(yè)務(wù)用戶提供不同的可視化效果。需要強(qiáng)調(diào)的是,盡管拉取事件是一種選擇,但投影還可以通過(guò)使用消息代理利用發(fā)布/訂閱模式,訂閱新事件。
這種設(shè)置通過(guò)捕獲事件的時(shí)間順序序列增強(qiáng)了系統(tǒng)的韌性,為全面的審計(jì)跟蹤提供了全面的記錄。因此,該方法允許進(jìn)行有效的時(shí)間查詢,使應(yīng)用程序在任何給定時(shí)間點(diǎn)都可以重建狀態(tài)。此外,它通過(guò)將數(shù)據(jù)模型變更與歷史事件日志分開(kāi),為業(yè)務(wù)需求的變化提供了靈活性。
結(jié)合CQRS,該機(jī)制促進(jìn)了命令和查詢職責(zé)之間的松耦合,提供了韌性和靈活性。
如上所述,EDA和ES都為可擴(kuò)展性和協(xié)作提供了非常強(qiáng)大的方式。EDA強(qiáng)調(diào)通過(guò)事件松耦合通信的組件,而ES捕獲并持久化狀態(tài)變更的歷史記錄。因此,如果我們使用ES生成的事件并將其用于EDA,那將是一個(gè)自然的組合。
生成的事件不僅可以包含變更的狀態(tài),還可以包含變更的詳細(xì)信息。然后,這些事件可以通過(guò)消息代理傳輸?shù)搅硪粋€(gè)服務(wù)/組件,并在EDA中被消費(fèi)。
事件溯源和事件驅(qū)動(dòng)設(shè)計(jì)的結(jié)合
上圖顯示了如何以一種非常直接的方式將ES和EDA結(jié)合起來(lái)。來(lái)自事件存儲(chǔ)的事件可以通過(guò)消息代理發(fā)布和被不同的服務(wù)和組件消費(fèi)。
將事件驅(qū)動(dòng)架構(gòu)(EDA)與事件溯源(ES)結(jié)合帶來(lái)了顯著的優(yōu)勢(shì)。其中一個(gè)主要優(yōu)勢(shì)是系統(tǒng)的響應(yīng)能力提升。這種設(shè)置允許系統(tǒng)快速適應(yīng)實(shí)時(shí)變化,在動(dòng)態(tài)環(huán)境中效率極高。
另一個(gè)關(guān)鍵優(yōu)勢(shì)是對(duì)狀態(tài)變更的全面歷史記錄,有助于詳細(xì)的歷史分析,并確保符合規(guī)范的強(qiáng)大審計(jì)跟蹤。此外,其不可變和可重播的特性使得實(shí)時(shí)分析、可擴(kuò)展性和適應(yīng)不斷變化的分析需求變得更加容易。事件還可以流式傳輸?shù)綌?shù)據(jù)分析流水線或復(fù)制到數(shù)據(jù)湖進(jìn)行進(jìn)一步處理。
此外,這種組合固有的靈活性和可擴(kuò)展性也值得注意。系統(tǒng)可以輕松演變以滿足不斷增長(zhǎng)的業(yè)務(wù)需求,確保長(zhǎng)期的可持續(xù)性和適應(yīng)性。
最后,系統(tǒng)的韌性也是一個(gè)值得關(guān)注的優(yōu)點(diǎn)。這種設(shè)置提供了強(qiáng)大的機(jī)制來(lái)恢復(fù)中斷,確保即使在具有挑戰(zhàn)性的情況下也能保持連續(xù)性和可靠性。
將事件溯源(Event Sourcing)和事件驅(qū)動(dòng)架構(gòu)(EDA)相結(jié)合引入了一系列挑戰(zhàn),包括協(xié)調(diào)分布式系統(tǒng)、確??蓴U(kuò)展和高性能的事件存儲(chǔ),以及管理模式演進(jìn)。
盡管存在這些挑戰(zhàn),將事件驅(qū)動(dòng)架構(gòu)和事件溯源相融合是一種強(qiáng)大的方法,當(dāng)?shù)玫搅己霉芾頃r(shí),它提供了一種動(dòng)態(tài)且強(qiáng)大的架構(gòu)。在設(shè)計(jì)和實(shí)施階段解決這些挑戰(zhàn)對(duì)于充分發(fā)揮這種組合架構(gòu)策略的潛力至關(guān)重要。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流