2017-08-08 30 views
0

我們即將放棄ES,因爲我們需要流程的一致性讀取模型,並且在試圖弄清楚我們如何節省ES時,我們正在考慮一致的讀取方面。基本上,一個命令將由AR運行,生成事件列表。這些事件首先被保存到事件存儲器,然後(通過一些額外的編碼)專門用於讀取模型(以事務處理的方式,即,來自單個命令的所有事件的所有預測都將被包裹在事務中)。只有在此之後纔會發佈這些活動。所以基本上我的代碼將是這樣的:事件採購沒有最終的一致性?

void ExecuteCommand(Command cmd) { 
    // validate and stuff... 
    var events = GenerateEvents(cmd); 
    PersistAllSync(events); 
    ApplyProjectionsSync(events); 
    PublishAsync(events) 
} 

除了明顯的性能問題(一種分佈式事務,bascially序列化的所有命令)...爲什麼沒有人做呢?

+0

這可能會在出現錯誤時變得不一致。例如,說'ApplyProjectionsSync'成功,但是'PublishAsync'失敗。這將創建一個讀取模型發生更改的情況,但事件不在流中。 –

+0

你應該大概說出這意味着什麼; _needing_一致的讀取模型實際上很不尋常。當你不這樣做時,你需要他們保持一致是相當普遍的。 – VoiceOfUnreason

+0

@Lev你能否滿足你爲什麼需要一致的看法?只有知道爲什麼我們可以找到採用事件採購的方式...... – Narvalex

回答

0

我不是專家,但我可以嘗試回答這個問題。

爲了獲得事務一致性,我將生成的事件(在相同的聚合/事務範圍內)分組,並將它們全部原子地應用於我的讀取模型。而且我還發布了分組爲事務的事件。它適用於我,所以它當然有可能。

爲了避免本地讀取模型的最終一致性(以便我可以在命令響應中返回新的一致狀態),我也在事務中的本地應用事件。只要你沒有太多的讀取模型來更新,我想這應該不成問題。如果需要的話,您可以對一些需要非最終更新和更新的讀取模型進行設置,並按照「常規」方式進行修改和處理。