1

はい、似たようなことが少なくとも数回前に尋ねられました。したがって、答えはわかります。単純に、新しいハンドラーでイベントを再生するだけです。しかし、実際に実装してみると、いくつかの疑問が生じます。

私は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 分遅れている場合はどうなりますか? それとも1時間半?私は NServiceBus も使用しているので、新しいハンドラー キューは特定の時点からイベントを積み上げます。新しいアプリケーション ビューが開始時に完全に同期していることを 100% (99% ではありません) 確認しながら、EventStore からイベントを取得する方法を教えてください。

また: コードに特別なインポート メソッドを作成しますか? つまり、新しいアプリケーションのハンドラーが「SomeDomainEvent」を処理するときに電子メールを送信するとします。10,000 件の古いイベントすべてについてメールを送信したくありません。praxis/codeでこの「インポート」をどのように行いますか?

4

1 に答える 1

1
  1. べき等性をミックスに追加します。Jonathan は、EventStore プロジェクト (v2) に関する彼のブログ投稿でこれについて語っています。冪等性と組み合わせた少なくとも 1 回のメッセージ配信により、同じメッセージを 2 回処理しないことが保証されます。そのため、数分 (30 分でも) ずれていても問題ありません。この冪等性の動作を NSB ハンドラにも統合する必要があります (最初のハンドラなど)。
  2. ハンドラーに副作用がある場合 (新しいレポート/ビューを取得するために再生しているという印象を受けていたので奇妙に思えます)、現在の時間とイベント時間を使用して、過去。または、何もしない NullEmailSender:IEmailSender を使用して (IoC を使用して) ハンドラーを構成することもできます (現在のパスが過去の再生の 1 つであることがわかっているため)。
于 2011-08-21T12:41:20.213 に答える