事件採購和CQRS是偉大的,因爲它會趕走被卡住它的開發者一起工作的應用程序的生命週期,除非有一個大的數據遷移項目一個預建模的數據庫開發人員。 CQRS和ES還具有擴展事件存儲,審計日誌等已經遍佈互聯網的其他好處。使用Event sourcing和CQRS的缺點是什麼?
但是,什麼缺點呢?
這裏是我能想到的研究和寫作小的演示應用程式後
- 複雜一些缺點:有人說ES是複雜的。但我認爲有一個複雜的應用程序比複雜的數據庫模型更好,在這個模型上只能使用查詢語言(多個連接,索引等)運行非常有限的查詢。我的意思是像Scala這樣的編程語言有非常豐富的集合庫,它非常靈活地生成一些嚴重複雜的聚合,並且還有Apache Spark,這使得它可以輕鬆查詢分佈式集合。但數據庫將始終受限於查詢語言功能,而分佈式數據庫更難以分發應用程序代碼(只需在另一臺機器上部署另一個實例!)。
- 高磁盤空間使用情況:事件商店可能最終使用大量的磁盤空間來存儲事件。但是我們可以每隔幾周安排一次清理工作並創建快照,也可能是我們可以在外部HD上本地存儲歷史事件,只是因爲我們將來需要舊事件?
- 內存佔用率過高:每個領域對象的狀態存儲在存儲器中這可能會增加內存的使用,我們都RAM是多麼昂貴。 大問題!,因爲我很窮!任何解決方案?可能會使用Sqlite而不是在內存中存儲狀態?我通過在應用程序中引入多個Sqlite實例來使事情更復雜嗎?
- 較長的啓動時間:失敗或軟件升級啓動速度較慢,具體取決於事件數量。但是我們可以使用快照來解決這個問題?
- 最終一致性:問題對於某些應用。想象一下,如果Facebook使用CQRS的事件採購來存儲帖子,並考慮Facebook的系統有多忙,並且如果我發佈了一篇文章,我會在第二天看到我的FB帖子:)
- Event store中的序列化事件:Event stores store events作爲序列化對象,這意味着無論如何我們都無法查詢事件存儲中的事件內容。我們將來無法再爲該活動添加其他屬性。解決方案是將事件存儲爲JSON對象而不是序列化事件?但這是個好主意嗎?或者添加更多的事件來支持對orignal事件對象的更改?
可有人請我上帶來了這裏的缺點意見,並糾正我,如果我錯了,並建議其他任何我可能已經錯過了?
爲什麼每個域對象的狀態都存儲在內存中?當需要時,域對象將從事件中重新創建。爲什麼你認爲FB不會使用事件採購,只是因爲他們很忙?我的理解是,他們使用單個寫入主機和幾個同步「最終」的讀取從機,所以他們確實使用最終的一致性,這就是爲什麼有時您可以發佈某些內容,然後在Feed中看不到它。 –
有道理!但我認爲域對象的狀態將被存儲在內存中的原因是因爲它們的重新創建非常昂貴。每次有該域對象的1個屬性更新時,是否真的推動每個域對象有數千個事件?我想我對FB沒有使用事件採購是錯誤的。謝謝:) – hajime
通常你不會有每個對象有數千個事件,但是如果你這麼做的話可能不如你想像的那麼慢(簡單的選擇,沒有連接來獲取事件),然後應用在內存中。如果在進行性能測試時確實證明這是一個問題,則可以始終爲對象「快照」事件。 –