12

イベントストアとしてイベントソーシングを使用し、「レポートストア」として単純な(No)SQLストアを使用するいくつかのCQRSサンプル実装(Java / .Net)を調査しました。

すべて良さそうに見えますが、すべてのサンプル実装で何かが欠けているようです。

アプリケーションが本番環境に移行した後、新しいレポートストア/画面の追加を処理するにはどうすればよいですか?また、既存の(最新の)データをイベントストアから新しいレポートストアにインポートする方法は?

すなわち:

基本的なDDD/CQRS駆動のCRMアプリケーションを想像してみてください。すべての画面(実際に表示)には、独自の構造化レポートストア(SQLテーブル)があります。これらのビューはすべて、ドメインイベント(CustomerCreated / CustomerHasMovedなど)をリッスンするハンドラーを使用して更新されます。

CRMの機能の1つは、通話をログに記録できることです(PhoneCallLoggedイベント)。時間の制約により、CRMのV1でのみ通話のログ記録を実装しました(V2で実装される通話を誰が処理したかを表示および報告します)

本番環境でしばらく実行した後、顧客および営業担当者ごとにログに記録された電話の「レポート」を実装したいと考えています。

したがって、いくつかの画面(ビュー)とサポートするレポートテーブル(レポートストア内)を追加し、イベントストアですでに収集されているデータを入力する必要があります...

それは私が研究したサンプルを見ている間私が立ち往生しているところです。イベントストアから(新しい)レポートストアへの既存の(履歴)データのインポートは処理しません。

EventRepository(DomainRepository)のすべてのサンプルには、メソッド「GetById」と「Add」のみがあり、新しいレポートテーブルに入力するためにすべての集計ルートを一度に取得することはサポートされていません。

この初期データのインポートがないと、新しい画面は新しく発生したイベントに対してのみ更新されます。すでにログに記録された通話ではありません(PhoneCallLoggedイベントのレポートリスナーがなかったため)

何か提案、推奨事項はありますか?

前もって感謝します、

レムコ

4

3 に答える 3

8

既存のイベントログでハンドラーを再実行します(たとえば、新しいイベントハンドラーを介して古いイベントを再生します)

例を考えてみましょう...イベントログに大量のPhoneCallLoggedEventsがあります。新しいハンドルを取り、それを通してすべての古いイベントを再生します。その場合、常に実行されているようになり、到着した新しいイベントを処理し続けます。

乾杯、

グレッグ

于 2010-04-14T13:56:01.933 に答える
2

たとえば、Axon Frameworkでは、これは次の方法で実行できます。

JdbcEventStore eventStore = ...;

ReplayingCluster replayingCluster = new ReplayingCluster(
            new SimpleCluster("replaying"),
            eventStore,
            new NoTransactionManager(),
            0,
            new BackloggingIncomingMessageHandler());

replayingCluster.startReplay();

イベントの再生は完全に文書化されておらず、成熟したツールが不足している領域ですが、ここにいくつかの出発点があります。

于 2016-01-23T18:07:06.197 に答える
1

'EventRepository'には、本番環境でのみ必要なため、これらのメソッドのみが含まれています。

レポート用に新しい非正規化を追加する場合、最初からすべてのイベントをハンドラーに送信できます。

この方法で開発サイトでこれを行うことができます:

  • イベントログを開発サイトにロードします
  • すべてのイベントを非正規化ハンドラーに送信します
  • 新しいビューとハンドラーを本番サイトに移動します
  • 間に発生したイベントを実行します
  • これで準備ができました
于 2010-04-14T14:05:59.240 に答える