2011-08-17 40 views
1

是的,類似的問題至少在幾次之前就被問到了。因此我知道答案:你只是簡單地重放新處理程序上的事件。但實際執行會產生一些問題。如何使用EventStore在實踐中構建新的應用程序視圖?

我正在使用JOlivier的EventStore,這看起來不錯。對於初學者,我會忽略SnapShots的概念,只是想方設法讓我的活動結束。我所能做的就是這樣的代碼:

var commitList = Store.GetFrom(DateTime.UtcNow.AddSeconds(-1)); 
foreach (var commit in commitList) 
{ 
    foreach (var comittedEvent in commit.Events) 
    { 
     if (comittedEvent.Body is SomeDomainEvent) 
      Console.WriteLine(string.Format("Found interesting event: {0}", ((SomeDomainEvent)comittedEvent.Body).Value)); 
    } 
} 

這裏第一個問題當然是:這樣做的方法是?我在使用「GetFrom」參數時遇到了問題,因爲它只是一個DateTime,我不能確定所有服務器都是同步的。如果一臺服務器上的時鐘比另一臺服務器上的時鐘快1分鐘?還是半小時?我也使用NServiceBus,所以新的處理程序隊列會從某個時間點累積事件 - 但我怎麼能100%確定這裏沒有10秒鐘的時間?請告訴我如何從EventStore中獲取事件,同時100%(不是99%)確保新應用程序視圖在啓動時完全同步。

另外:你是否在你的代碼中創建了一個特殊的導入方法?我的意思是,假設我的新應用程序中的處理程序在處理「SomeDomainEvent」時發送了一封電子郵件。我不希望它爲所有10.000箇舊事件發送電子郵件。你如何在praxis/code中做這個「導入」?

謝謝。

回答

1
  1. 增加混合的冪等性。 Jonathan在他關於EventStore項目(v2)的博客文章中談到了這一點。至少一次消息傳遞與冪等性相結合將確保您不會處理相同的消息兩次。因此,休息幾分鐘(甚至半小時)並不重要。您需要將此冪等行爲集成到NSB處理程序中(例如,作爲第一個處理程序)。
  2. 如果你的處理程序有副作用(這看起來很奇怪,因爲我是在重放以獲得新報告/視圖的印象下),那麼使用當前時間和事件時間來決定是否應該發送電子郵件過去的東西。或者,您可以使用NullEmailSender撰寫您的處理程序(使用IoC):IEmailSender不會執行任何操作(因爲您知道您正在重放過去的路徑)。
+0

救援的權力是。而且非常重要:我對事件處理程序的理解是錯誤的。我正在考慮這些處理程序中的業務邏輯,這是一個誤解,謝謝。 – Werner

相關問題