2014-11-03 108 views
2

在CQRS中,我該如何堅持查看計數信息?例如用戶訪問特定頁面x次CQRS頁面查看計數

簡單的答案是,讀取模型更新其自己的表並增加計數。

但是如果我們需要從寫模型中重新構建讀模型呢?我們將丟失所有查看次數統計信息。

閱讀模型是否應該調用寫模型並告訴它頁面已被查看?

與此相關的問題是寫入模型現在有太多關於讀取模型實現的信息,即寫入模型不應該知道讀取模型如何顯示頁面。它應該從所有的讀取模型中分離出來。

人們如何在他們的系統中實現這一點?

+0

對於http://Programmers.stackexchange.com,這確實是一個問題。 – Mgetz 2014-11-03 18:09:13

+0

您可以將每次讀取審計排隊到命令隊列中,就像任何其他命令一樣。然後這將被寫入適用的寫入存儲器,該存儲器將(最終)被投影回原始讀取存儲器。如果readstore的讀取頻率很高(應該這樣,因爲這就是您選擇CQRS的原因:),您可能需要批量更新以限制寫入的頻率。 – StuartLC 2014-11-03 18:14:09

+0

@Mgetz你想寫一個完整答案的答案和一些解釋嗎?這將幫助我和其他人前進 – 2014-11-03 18:16:03

回答

1

您可能希望跟蹤或存儲的任何數據都是通過編寫模型來完成的,您不應該因爲某些看起來微不足道的事情或打破關注而打破CQRS的原則。

在這種特殊情況下,您將引入一個數據視圖跟蹤域,它不需要知道其數據來自何處。

如果您使用EventSourcing作爲您的數據存儲區,則可以將所有內容短路,並在收到頁面請求時發出DataViewedEvent

該命令可能類似於dataViewed(obj),其中obj可以是讀取模型所需的任何東西。該obj然後附加到DataViewedEvent。

這意味着當讀取模型接收DataViewedEvent時,它可以查看保存在事件中的obj類型,並只將它傳遞給關注該obj類型的處理程序。

例如

查看X頁面。調用dataViewed(PageXViewed)命令。 Read Model接收dataViewed事件,查看存儲在其中的對象,將PageXViewed傳遞給關注該頁面視圖的處理程序。

+0

這很有道理。你會拉入一種Sub Write模式嗎?由於數據只對特定的讀取模型感興趣。例如,您可以讓多個Read Model訂閱者以不同的方式呈現信息和頁面,並要求存儲不同的統計信息。如果'主'寫模型必須處理它,它可能會變得有點混亂 – 2014-11-03 18:22:21

+0

@Gaz_Edge這就是爲什麼我會使用EventSourcing,然後我的寫模型變得非常簡單,我不會在意。這只是流中的另一個事件。但是,除非有專門的服務,否則我不會冒昧地將其分解出去,因爲它真的是它自己的領域,應該這樣對待。 – Mgetz 2014-11-03 18:23:30

+0

是的,我使用事件採購。我認爲一個更好的方法可能是使用命令DataViewed(Obj),它從Read Model中獲取序列化對象,並將其添加到事件存儲中。在反序列化中,讀取模型可以檢查對象的類型,然後只將它發送給關心它的視圖。否則,你最終會有每個視圖檢查每個UriViewedEvent – 2014-11-03 18:28:17