經驗分享:從CRUD重構到事件源ES的有狀態系統 -Stitcher.io
專案是我們正在進行的較大專案之一。最後,它將為成千上萬的使用者提供服務,處理大量的財務交易,並且需要即時建立獨立於租戶的安裝。
一個關鍵要求是,可以輕鬆地報告和跟蹤整個歷史記錄,即企業的核心產品訂購流程。同時,也擁有一個易於使用的產品管理系統。
CRUD系統
首先討論一種如何基於CRUD系列的設計方法:
在這樣的系統中,可能會有兩個域組:Product和Order,以及兩個使用這兩個域的應用程式:an AdminApplication和a CustomerApplication。
在先前的專案中成功使用了該架構之後,我們可以簡單地依靠它一段時間。但是,它有一些缺點,特別是對於這個新專案:我們必須牢記,報告和歷史記錄跟蹤是訂購過程的關鍵方面。我們希望在我們的程式碼中如此對待它們,而不僅僅是程式碼的次要功能或副作用。
例如:我們可以使用活動日誌包來跟蹤有關訂單發生的“歷史訊息”。我們還可以開始在訂單和歷史記錄表上編寫自定義查詢以生成報告。
事件溯源EventSourcing
自然地,我們著眼於事件源,這是一種可以滿足上述要求的出色而靈活的解決方案。但是,沒有什麼是免費的:事件源需要編寫很多額外的程式碼才能完成其他簡單的事情。在通常需要簡單的CRUD操作來處理資料庫中資料的地方,現在您不得不擔心排程事件,使用投影儀projectors和reactors處理事件,同時始終牢記版本控制。
儘管很明顯,事件源系統可以解決許多問題,但即使在不會增加任何價值的地方,它也會帶來很多開銷。
如果我們決定Orders使用事件源,而Orders依賴於Products模組中的資料,如果Products不實現事件源,則我們將無法重建Orders狀態,因此,我們可以透過事件來源獲取所有資訊,或者為該問題找到解決方案。
事件源所有的東西嗎?
透過在我們的一些業餘專案中使用事件源,我們痛苦地意識到,我們不應該低估它所增加的複雜性。此外,格雷格·揚(Greg Young)表示,整個系統的事件溯源通常不是一個好主意-他對事件採購的誤解有完整的論述,值得一看!
對我們來說很明顯,我們不想為整個應用程式提供事件源。這樣做根本沒有任何意義。唯一的選擇是找到一種將有狀態系統與事件源系統結合在一起的方法,但是令人驚訝的是,在這個主題上我們找不到很多資源。
儘管如此,我們還是進行了一些勞動密集型研究,並設法找到了我們問題的答案。答案不是來自事件溯源社群,而是來自完善的DDD慣例:有界的上下文。
如果我們想要的Products模組是一個獨立的,有狀態的系統,我們必須清楚地尊重Products和Orders之間的界限,而不是一個整體單體的應用程式,我們將不得不將這兩個模組視為兩個單獨的上下文,包括單獨的服務,僅允許以保證該Order上下文永遠不會以無效狀態結束的方式相互交談。
將其Products視為透過REST API訪問的單獨服務。即使API離線或對其資料結構進行了更改,我們也可保證事件源應用程式仍然可以正常工作。
更多詳細點選標題見原文。
相關文章
- 使用Kafka Streams構建事件源系統的經驗Kafka事件
- Java的CQRS和事件溯源ES入門:如何從CRUD切換到CQRS/ES - BaeldungJava事件
- 系統設計架構:有狀態與無狀態架構
- TypeScript 重構 Axios 經驗分享TypeScriptiOS
- 向高手請教--系統重構經驗
- 從入門到菜鳥的經驗分享
- 工作流從無狀態切換到有狀態的好處
- 從業 30 年的女系統管理員的經驗分享
- c站(clicli.us)3.0 重構經驗分享
- 滴滴 webapp 5.0 Vue 2.0 重構經驗分享WebAPPVue
- 從0到1搞懂分散式架構:Uber大型支付系統構建經驗總結分散式架構
- Cloudflare 從 PHP 到 Go:遷移與經驗分享CloudPHPGo
- 新增橋接連線狀態監控、重構日誌系統橋接
- HomeAway分享雲端事件溯源經驗事件
- 雲控系統的玩法和實戰經驗分享
- 事件溯源:是來自事件的狀態與作為狀態的事件? - verraes事件
- SAP QM 檢驗批的系統狀態標識‘HUM'
- 從 CRUD 遷移到事件溯源的祕訣 - eventstore事件
- 基於有窮狀態機思想的電梯系統
- 線上高併發應用重構(寫)填坑經驗分享(一)
- 線上高併發應用重構(寫)填坑經驗分享(二)
- MySQL從庫維護經驗分享MySql
- Linux系統入門實操經驗分享Linux
- [譯] 使用原生 JavaScript 構建狀態管理系統JavaScript
- 專案重構經驗記錄
- freebsd從安裝到想要的狀態配置
- 大型系統的重構
- 經驗分享:如何系統學習 Web 前端技術?Web前端
- 微信群控系統的應用和實戰經驗分享
- 重構:從Promise到Async/AwaitPromiseAI
- 有狀態和無狀態的區別
- Mapboxgl地圖重繪完成事件 | idle狀態地圖事件
- 開發者分享如何從專案失敗中尋找到有價值的崛起經驗
- 從CRUD程式設計切換到事件溯源和區塊鏈程式設計程式設計事件區塊鏈
- Flash----一種VirtualActor模式的分散式有狀態系統原型模式分散式原型
- 經驗分享 ----------
- 經驗分享
- 從 Flutter 的視訊渲染到 App 落地經驗FlutterAPP