天天看點

為什麼要從 CRUD 轉向事件源架構?

作者 | Savan Kharod

譯者 | 平川

如果對各種架構風格都有個透徹的了解,設計者就能夠建構新型的、反應性的、有彈性的大型應用。是以,遵循這些經過行業檢驗的标準可以節省時間、保證可靠性,并推動目标實作。畢竟,企業有什麼理由要花時間和資源來重新發明輪子?

但僅僅了解不同的架構,如基于 CRUD 的架構、基于微服務的架構 和基于事件源的架構,并不足以做出全面的決策。我們需要深入了解細節,并了解它們各自的特性、适用性和所提供的價值。在這篇文章中,我們将看一下 CRUD 和事件源架構,思考為什麼應該考慮從前者遷移到後者。

什麼是 CRUD?

CRUD 是建立、讀取、更新和删除的縮寫。它構成了資料庫的四個指令,四個不言自明的指令,這些指令被認為是持久性存儲管理的必備要素。這種模式被各行各業的企業廣泛用于跟蹤客戶資料、員工資訊、支付記錄、賬戶等。

讓我們快速說明一下 CRUD 的正常事件流。Gary 正在浏覽一個電子商務網站。他把一個遊戲機、一個控制器和一個遊戲添加到購物車中。此時,購物車的資料庫看起來大概是這樣:

為什麼要從 CRUD 轉向事件源架構?

假如我們添加另外一個物品(如耳機),則資料庫會變成下面這樣:

為什麼要從 CRUD 轉向事件源架構?

如果 Gary 删除了耳機,則表就會變回之前的樣子。此外,如果他另外添加一個控制器,則資料庫會變成下面這樣:

為什麼要從 CRUD 轉向事件源架構?

本質上,資料庫遵循建立 - 讀取 - 更新 - 删除的方法來維護表。“更新”和 “删除”功能是 CRUD 的特點。

CRUD 方法的局限性

雖然 CRUD 方法由于其操作的輕量化和簡單性而備受青睐,但它也有自己的一系列局限,這包括:

對于 CRUD,最常見的批評是原始、過時。與其說它是一種架構或設計,不如說它是一個可供遵循的循環步驟,不管是建構一個資料庫還是一個 API。

CRUD 依賴于資料庫中狀态的持久性。然而,考慮到目前資料操作事件的動态性,這種資訊的存儲可能是浪費和資源密集型的。

盡管 CRUD 架構很簡單,但在開始階段,它需要人們花費大量的精力編寫大量的代碼。盡管如此,當涉及到雲負載均衡時,CRUD 卻無法勝任。

雖然 CRUD 代碼開始時可能很簡單,但當它開始與其他服務或微服務共享資料時,就會出現與狀态同步和故障處理有關的問題。

CRUD 架構所涉及的複雜性将需要同樣複雜的解決方案,這可能會延伸到故障跟蹤、手動狀态記錄、異步批處理等。這方面的考慮在編碼和整合上都會比較艱難。

在 CRUD 模型中,實體執行個體通常是雙重表示,一是記憶體中的可變對象,二是關系資料庫表中的一個可變行。這樣的結構導緻了臭名昭著的對象 - 關系阻抗不比對。試圖彌合這種鴻溝的努力卻進一步增加了這一架構的複雜性。

什麼是事件源架構?

事件源是一種資料存儲技術,被認為是 CRUD 的更新版。它隻關注建立和讀取功能,而完全省略了 CRUD 中更新和删除值的操作。更簡單地說,你不能通過事件源執行破壞性的操作。

那麼,它是如何克服 CRUD 面臨的挑戰的?

這裡有個有趣的地方:與 CRUD 遵循的傳統方法不同,事件源将變化逐個記錄下來,作為目前狀态随時間變化的一系列增量,而不是持久化目前狀态本身。通過這種方式,事件源賦予了狀态變化可追溯性。在大多數情況下,這種設計通常與領域驅動設計(DDD)和指令查詢責任分離(CQRS)設計模式相結合。

為了更好地了解事件源架構,讓我們以 Gary 的銀行賬戶為例。假設 Gary 的賬戶裡有 2400 美元。他用 499 美元購買了 PS5 遊戲機。電子商務網站為他提供了 49 美元的返現。在這種情況下,事件源表會是這樣的:

為什麼要從 CRUD 轉向事件源架構?

通過追蹤一段時間内的取款和存款,可以計算出他目前的賬戶餘額為 1950 美元。這種狀态的複原和事件的回放被稱為重放。

我們可以把事件源視為客戶活動的日志。

如果我們從電子商務平台的角度來看 Gary 的活動,添加遊戲機是第一個事件,添加控制器是第二個事件,以此類推。事實上,結賬過程也是一個獨立的事件。如果 Gary 不小心在購物車中添加了三個控制器(例如,事件 1、2 和 3),然後他又删除了一個,那麼删除也是一個獨立的事件:事件 4!

采用事件源架構的好處

從對事件源的基本了解來看,它似乎是一個更好更完善的替代方案,克服了 CRUD 的缺點。為了進一步說明這一點,讓我們看一下事件源已被證明了的優勢。

事件源遵循事件驅動的架構,友善在狀态變化時可靠地釋出事件。

它通過持久化事件而不是領域對象,克服了 CRUD 中出現的對象 - 關系阻抗不比對問題。

它維護了一系列事件的記錄,可以在隻限追加的狀态下進行操作。通過消除狀态跟蹤和實體關系的需求,編寫讀寫資料庫的事件源代碼更容易。

由于保留了實體如何到達目前事件的日志,是以事件源保證了審計資料和交易資料的一緻性,因為它們是一樣的。此外,它也是一個很好的故障保險,因為資料可以從事件日志中重建。

所有的事件隻是被追加到現有的資料庫中,并且更新和删除功能已被去掉,事件源架構隻關注寫入,這提高了其性能。

事件源允許對事件流進行分析,這有助于企業從中擷取關鍵資訊。他們可以獲得所有系統活動的頂層視圖,而不會使寫入功能複雜化。

遵循事件源模型的架構更容易測試和調試,因為在引入指令和事件之前,可以對其進行模拟測試。此外,事件日志還可以作為一個很好的調試活動記錄,如果發現問題,可以在受控環境中重放事件日志,以了解導緻異常的原因。

它可以存儲任何類型的資訊,任何消費者隻要獲得授權,就可以通路這些資訊。它允許通過時間查詢實體在任何時候的狀态。是以,它非常靈活。

與單體架構相比,事件源應用程式更容易遷移,因為它們遵循基于微服務的架構。之是以如此,是因為參與事件交換的業務實體之間是松耦合的。

結 語

随着越來越多的應用程式需要以有序和異步的方式傳遞實時資料,企業對事件源的需求也越來越大。此外,它也是在網絡規模上消費和管理應用程式日志資料的絕佳方法。在這種情況下,事件源成了一個唯一的事實來源,提高了應用程式的可靠性。

那麼,你所在的企業打算何時從 CRUD 遷移到事件源架構?

https://dzone.com/articles/why-do-you-need-to-move-from-crud-to-event-sourcin?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJhY2Nlc3NfcmVzb3VyY2UiLCJleHAiOjE2NDIxNDU1NzUsImciOiJLOEdoZGtjdlF2SHkzeDhwIiwiaWF0IjoxNjQyMTQ1Mjc1LCJ1c2VySWQiOjI0MzYwNzkwfQ.yHCE5wZnN1J6Gb4eKsvz-XrB82uZpWtFq3OmKmoHzbg