是的,類似的問題至少在幾次之前就被問到了。因此我知道答案:你只是簡單地重放新處理程序上的事件。但實際執行會產生一些問題。如何使用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中做這個「導入」?
謝謝。
救援的權力是。而且非常重要:我對事件處理程序的理解是錯誤的。我正在考慮這些處理程序中的業務邏輯,這是一個誤解,謝謝。 – Werner