2012-04-17 9 views
4

MongoDBでCQRS + Event Sourcingアーキテクチャを実装する新しいプロジェクトを開始します。私たちは既にCQRSのアプローチについていくつかの経験を持っています。以前のプロジェクトでは、Fohjinのフレームワークを出発点にしました(よくリファクタリングしました)。 Oracleをストレージとして使用し、その場合はTransactionScopeで2PCを実装しました。CQRS、Event Sourcing、NoSQLデータベース

しかし私たちの新しいプロジェクトでは、スケーラビリティとパフォーマンスの面でMongoDBを使いたいと考えています。私たちは間違いなくread(report)の部分に使用し、イベントストアのためにそれを補いたいと思っています。代わりに、SQL Serverを使用してイベントを格納する方法もあります。だから我々は選択をする必要があります。私がハイブリッドソリューションについて気に入らないのは、高価で遅く、異なるDbタイプ(MongoとSQL)をサポートする必要があるTransactionScopeです。

私たちはNCQRSを見ましたが、私たちは私たちの視点とは異なる方法で実装できる多くのフレームワークに強く依存したくないようです。そこで、私たちはJonathan Oliverのイベントストアのような軽量なものを考えています。私はストリームとコミットのコンセプトが好きで、MongoDBもサポートしています。私がまだ理解していないもの、それが2PCのすべてのものをどのように処理するか(NoSQLの場合)私たちの場合、いくつかのイベントハンドラにイベントをディップする必要があります。特定のタイプのイベントのために、読み込みデータベースとタスクスケジューラを更新する何らかのデノミザライザーです。これらのハンドラに何か問題があり、例外が発生した場合、MongoDBのコミットをロールバックする方法はありません。これに対処するトリックはありますか?

私は正しい判断を下す方法と賛否両論について何かコメントをいただき、ありがとうございます。

答えて

4

EventStoreはGuidを使用してデータベースに対してコミットを一意に識別し、同じイベントストリームが複数回保持されないようにします。通常、このGuidはメッセージに直接埋め込まれ、特定のメッセージを一意に識別し、イベントストリームでCommitChangesを呼び出すときにCommitIdとして使用できます。システムのクエリ側でイベントを処理する場合も同様の方法を使用できます。

2PC上のいくつかのより多くの情報と分散トランザクションの回避:

+0

はあなたの答え、エリオットいただきありがとうございます。私が理解する限りでは、イベントハンドラ/パイプラインフックを無意味にする必要があります。イベント/コミットがすでにディスパッチされたと判断するフィルタを追加します。それは各ハンドラのために余分なコードをたくさん追加するように思えます(多分、それはアスペクトまたはこれのようなものとして実装することができます)。 Busidesでは、各ハンドラに新しいdbクエリを追加してチェックします。しかし、私たちはそれを「ソリューションのコスト」と呼ぶことができます。別の問題は、部分的に処理されるイベント/コミットを処理するときです。 – Voice

+0

ええ、独自のイベントハンドラを冪等にするためのインフラストラクチャを構築する必要があります。あなたのイベントにユニークなIDを埋め込み、このIDを読んだモデルに含めることで、イベントを複数回処理したかどうかを知ることができます。 –

関連する問題