2015-11-09 18 views
4

我最近閱讀了一些關於CQRS和事件採購的文章。雖然在我看來,第一個解決方案非常複雜且風險很大,可以解決業務不佳和設計不良的數據訪問層和數據模型,但最後似乎解決了許多問題。使用Event Sourcing來擺脫關係數據庫?

問題解決使用事件採購:

  1. 擺脫關係數據庫和對象關係映射,像NHibernate和實體框架。編程領域幾乎沒有人想要關注諸如索引,表/索引碎片或規範化之類的東西,如何設計關係數據以及如何編寫/配置ORM(自己的科學)。

  2. 將業務模型和內存中的「數據庫」統一起來,一個實體/總體服務將所有相關項目保存在內存中,通過簡單地將CUD事件傾倒在某個地方而沒有太多痛苦來保持完整性。舊項目可以從內存中逐出並轉儲到NoSQL(或其他)存儲,並用於彙總計算,報告,搜索以及必要時重新激活。如果我理解正確,像VoltDB這樣的內存數據庫也會以類似的方式使用事件轉儲,但仍然是關係數據庫,與業務邏輯分離。取決於數據是否同時發生了變化(或者相當複雜的DB代碼),而不是使用一般的「成功或失敗」邏輯來鎖定(可能存在完整的系統死鎖)或樂觀鎖定, ,合併規則可以在代碼中實現。

  3. 歷史:在實施審計功能,墓地表或「已刪除」標記列或可能需要刪除的數據時,沒有更多的痛苦。數據複製/搜索/報告:使用全文索引而不是追蹤缺失的關係索引,創建適當的查看區域,以所需的格式爲用戶準備數據,而不是在關係數據庫中使用醜陋的複製例程,與觸發器,後續存儲過程,甚至程序代碼複製數據到六個不同的表。

  4. 版本控制:使許多不同的關係數據庫版本運行許多模塊是很痛苦的,每個版本都有不同的表和列,並且需要適當的ORM映射。在單層模型中可以更容易,事件轉儲接受任何對象格式(通常爲無模式或鬆散模式的NoSQL文檔,表示爲JSON或XML)。也可以通過「數據模式更改事件」鏈升級舊數據(而不必維護關係數據庫的遷移腳本)。

N層的商業模式/關係數據庫/ ORM亂

N層的方式在十年或更長的時間以前可能是一個業務層和數據訪問層。爲了保持分離的嚴格性,許多關係特性被省略了,以便在業務層中實現它們:關係完整性,規範化,數據庫就是我所說的「垃圾轉儲」:看起來像一個玩弄SQL Server的小孩Management Studio或Access。極端非標準化的多態引用(引用不同源表的「外鍵」列,由「ReferenceSource」標記標識),針對不同類型的業務對象濫用相同表以及將數據重複到許多其他表其他地方),因爲性能不太好,這應該會改善查詢。ORM的用法也沒有對象引用,簡化爲單個對象加載和保存操作。加載一個聚合(一個實體/錶行的圖形)將遍歷該圖形,併爲每個子實體集發送一個查詢。

當性能變差並且可能孤兒參考引起嚴重麻煩時,可能會嘗試實施經典的關係設計,但不可能使增長的系統適應完整的數據重新設計(沒有人願意爲此付費) ,幾乎沒有人會知道如何映射對象關係,甚至優化ORM中的加載。這種嘗試僅限於設計中的一些地方,可能使得數據模型和訪問更難以維護。

CQRS的n層的頂部?

爲了獲得可接受的性能,單獨的SQL查詢都可能內置了某些模塊,繞過商業模式與它的單個對象的迭代訪問。這整個結構突然被稱爲事實上的CQRS,因爲單獨的查詢訪問(可以通過良好實施的關係數據模型和ORM使用來處理,只要它不應該是「大數據「類似Google或Stackoverflow的工作負載)以及關係表中的大量重複數據,這些數據是爲即時應用程序訪問而準備的。

東西比不恰當的表格格式更好?

好的,我讀了CQRS,雖然我不喜歡使用前面描述的「CQRS」,但事件存儲而不是關係數據庫的概念看起來非常有用:它不太可能成功強制引入原始的先進的關係型數據庫設計和OR映射,即使這樣做會極其昂貴。實際上,普通的面向對象編程比大多數數據庫表格更「標準化」,因爲需要將所有數據全部壓入表格格式或爲對象圖表/聚合創建大量表格。我同意:必須手動處理搜索索引和碎片整理,模式管理和數據歷史跟蹤,就像石器時代的IT,比如運行福特T模型和蒸汽機車,除了現代汽車和電動高速列車。

任何好的經驗?

如何是關於使用事件採購(不一定全CQRS)的經驗?它是否消除了關係數據庫帶來的很多痛苦?我真的很期待一種集成了所有業務邏輯的內存數據庫,並且可能足夠快以使單獨的查詢模塊成爲可能!

回答

3

有很多在這個問題上怎麼回事,這麼一個具體的,可操作的答案是不可能的,但如果你正在尋找一個那麼...

這取決於你的域。

CQRS/ES/DDD是不恰當的解決每一個問題 - 它不是靈丹妙藥。如果域名錶明CRUD/NTier會足夠好,那麼這就是你應該使用的。你列出的所有問題都是基礎設施或系統特徵,並且沒有說明應該告訴你選擇的工具或實踐的事情;你想要建立什麼?

2

雖然CQRS,ES和DDD經常一起使用,但它們是獨立的概念,它們本身非常強大。指令查詢責任分離(Command Query Responsibility Segregation):這是一個非常有用的設計軟件的模式。這個想法是保留那些不改變狀態(命令)的東西(查詢)。在許多系統中,查詢修改數據庫的狀態,這使得開發人員很難推斷髮生了什麼。

想象一下,執行查詢以查找某些信息並意識到信息因爲您查詢而發生了變化。

CQRS禁止這些行爲。命令(不能返回信息)改變狀態,查詢(返回信息)不能修改狀態。這樣,您就可以確定代碼的哪些部分是冪等的(因此可以根據需要調用,無副作用)以及哪些部分更改狀態。

DDD(域驅動設計):這是代碼的「數據結構」的設計方法。它不規定數據庫訪問技術或許多技術細節。它所做的是提供指導原則和概念來構建應用程序中的數據,使其更能夠響應實際用戶的需求。它也簡化了開發(儘管它不僅僅是把東西放在一起)。

ES(比賽採購):事件採購是數據存儲的策略,從狀態(在當前時間點的一塊數據的實際值)的數據移位存儲到轉變(變化發生在其生命週期中的一段數據),其被稱爲事件

使用ES有幾個優點。

首先,它允許企業存儲更多關於之前發生的事情的信息(對數據科學家來說是一個福音)。在傳統系統中,大量信息會丟失以更新數據,除非明確記錄這些更新,否則信息將永遠消失。這在ES中不會發生。其次,存儲所有事件使得調試更加簡單,因爲現在開發人員可以在數據處理開始後跟蹤數據的處理過程。對很久以前發生的一段數據的更新(並且將被另一次更新重寫並丟失),但可以識別並修復已損壞的處理。此外,修正的影響甚至可以涵蓋發生在錯誤事件和上次事件之間的所有計算。在傳統的系統中,這是不可能的,因爲我們只存儲最新的狀態。

儘管理論上可以編寫事件源系統而不使用 CQRS或DDD,但這樣做顯然更加困難。