CQRS / ESの世界での報告
-
21-12-2019 - |
質問
ES + CQRSの文脈で読み取りモデルのアイデアを理解していると思います(そうでなければ私を修正してください)。しかし、私はまだ「深刻な」報告の文脈でそれを使用することについて数疑問を持っています。私はリレーションモデルを使って私の読み取りモデルをcrudしてくれると言いましょう。 1つの基本的な「サマリー統計」を読むモデル 'は次のようになります。
class SummaryStats1
{
public Guid TypeId { get; set; }
public string TypeName { get; set; }
public Guid SubTypeId { get; set; }
public string SubTypeName { get; set; }
public int Count { get; set; }
}
.
イベントを考える:
TypeId = 3acf7d6f-4565-4672-985d-a748b7706a3e
TypeName = Bla1
SubTypeId = 41532aa1-f5d1-4ec4-896b-807ad66f75fc
SubTypeName = Bla2
.
正常業者:
(1)上記の組み合わせのインスタンスがあるかどうかを確認します(typeid、typename、subtypeId、subtypeName) (2)インスタンスがない場合は、インスタンスを作成し、カウントを1に設定します。それがあるならば、それが1つずつ増加するでしょう。
これは許容される報告アプローチですか?私はこの正規化されたデータ構造に対して非常に効率的な選択を実行することができると思います(フィルタリングおよびその他のSQL '投影のための):
SELECT TypeName, Sum(Count) FROM SummaryStats1 GROUP BY TypeName
.
CQRS / ESの専門家はこれに同意しますか?これは物事をすることの「方法」です(すなわち、これらの専用レポートの読み取りモデルを作成する)。ソースコード/実際の例への参照は非常に高く評価されます。
解決
これは受け入れられた報告アプローチですか?
の再輸入アプローチはあなたの要求によって異なりますが、一般的なアイデアは正しいです。
要約:
あなたの読み取りモデルを生成します(時々使用される公式の用語は EAGER読み取り)ベースあなたのドメインから来るイベントについて
- 記載されているSQLビュー
-
typeName
によってグループ化されたPreaggRegatedビューは、クエリ - 時刻でグループを実行する必要がない(代わりにノーマイザのグループ化を計算する)。 - Redisでincreビュー(あなたが説明するように思われるものの代替案)
- elasticsearch / solr検索索引
- キーによるいくつかのクイックルックアップのKV-Store / Index。
短い、読み取りモデルを構築する方法について正しいか間違った方法はありません。これらのモデルの影響をどのように書き込むかについて考えなければならない(単に彼らが以来ずっとしていないので、あなたが疑問パターンとパフォーマンスのボトルネックに基づいて)、美しさはあなたが完全に自由にモデルを読むことを完全に自由にしていることです(単に彼らが以来そうではないから)。 CQRSは読み書きを分割します)
CQRと組み合わせてEventSourcingを使用すると、NICERの可能性、すなわち新しいReadModelsを作成し、EventSourceから過去のイベントを再生するだけでデータを入力してデータを入力します。
あなたのデータの「読み取りモデル」と見なされるかもしれないもののいくつかの追加例:
アイデアは、これらの「読み取りモデル」/ビューは常に最新の状態に保たれています(通常はpubsubによって)(通常はPubsubによって)