2012-04-30 73 views
5

我們創建了一個電子書閱讀器的Web應用程序。所以有一點要記住的是,這個領域並不完全是閱讀一本實體書。我們現在試圖通過存儲用戶訪問的電子書頁面的信息來收集用戶的閱讀行爲。由於這些信息發送到數據倉庫,我們認爲從書籍控制器發起事件是正確的方式。引發事件或發送命令?

bus.Publish()

但我們不知道它應該是一個發佈或發送因爲有真的只有一個消費者對這個事件,這是我們的商業智能團隊。我們還讀到,從Web應用程序發佈是不可取的(http://www.make-awesome.com/2010/10/why-not-publish-nservicebus-messages-from-a-web-application /)。因此,現在替代方案是使用總線。發送(RecordPageAccessedCommand)

但是,上述命令不會改變我們的應用程序狀態。那它真的是一個命令嗎?我有一種感覺,我們犯的錯誤是使用NServiebus的功能(發佈,發送),並試圖將其與命令或事件等同起來。

請讓我知道這是什麼解決方案。

+0

訪問時是否可以增加書上的計數器?然後DW可以稍後ETL計數。您的應用可能對這些數據感興趣,以識別熱門書籍或提出建議。 –

+0

@AdamFyles是的,這是可能的。這就是我們目前所做的。有幾個這樣的事件,我們希望轉移到一個基於事件的非阻塞模型用於性能目的。 – darthjit

回答

10

根據您提供的信息,我會建議「發送」到您的端點。

發送命令意味着處理消息的端點應該執行某些操作。在你的情況下,記錄該頁面被訪問是端點應該做的事情。

發佈事件意味着您正在通知0..n訂閱者發生了某些事情。如果系統中的某些其他服務對訪問頁面的事實感興趣,則可以從命令處理程序發佈事件。這裏的關鍵在於,除非你記錄它,否則它不是一個「事實」。

我發現一旦數據可用,消費者往往會增長。有能力從您的命令處理程序發佈事件將使得通知新的消費者而無需更改/冒着現有的代碼庫風險變得微不足道。

1

RecordPageAccessedCommand是一個命令,因爲它是命令系統做一些事情,在這種情況下,記錄一個頁面已被訪問。

如果我已經正確理解你的情況。一條消息應該從您的控制器發送到「商業智能團隊服務」,告訴系統記錄一個頁面已被訪問。該服務將存儲此信息,並且將成爲此信息的所有者/技術權威。

沒有其他服務應該以純粹的形式存儲或需要這些信息,但是他們可以訂閱來自此服務的事件,例如,當用戶閱讀1000頁「Business Intelligence Team Service」可以發佈時一個1000頁已被讀取的事件,即Bus.Publish(),這可以由計費服務處理,該計費服務在下次購買時給予用戶折扣。

數據倉庫可以訪問存儲在您的「商業智能團隊服務」中的信息,因爲它將屬於IT/OPS。