2017-07-17 8 views
0

イベントソーシングアーキテクチャを実装していて、集計にメモリに大量のレコードが含まれています。メモリ内のレコードのどれだけの.NET店舗を大量にテストするために、私は簡単なプログラム作成:設定ファイルでイベントソース:メモリに大量のレコードを格納する際のオーバーヘッド

static void Main(string[] args) 
    { 
     Dictionary<string, object> dict = new Dictionary<string, object>(); 

     int maxRecords = 100000000; 

     for (int i = 0; i < maxRecords; i++) 
     { 
      dict.Add(i.ToString(), new String('A', 10)); 
     } 

     Console.WriteLine("Done"); 

     Console.ReadLine(); 
    } 

を、私が持っている:

<runtime> 
    <gcAllowVeryLargeObjects enabled="true" /> 
    </runtime> 

だから私は億個のレコードを格納していますし、各レコードは10バイトです(おそらくUnicodeなので20としましょう)。だから私はメモリに約2GBのデータを保存しています。ただし、アプリケーションは15GBまで拡張されます。

  1. 理想的にはIDictionaryに物事を保存したいと思います。オーバーヘッドを減らすためにできることはありますか?

  2. 大量のデータをメモリに保存するイベントソーシングアーキテクチャで働いていた人は、これとあなたの集計をどのように構築したかについての経験を共有してください。この質問のための

+0

なぜ集計をメモリに保存しますか? –

+0

集計をデータベースに格納すると、CRUD操作とオブジェクト・リレーショナル・マッピングを行う必要がないようなイベント・ソーシングの利点が失われますか? – Sandy

+0

あなたは何かを緩めず、スケーラビリティを得ることができます。 –

答えて

0

クラシックソリューションは、通常、二つの点の上に立つ:

  • は正しい集約ルートを選択し、その状態にそれらのうち小さいであろう。集約通信は許可されないため、単一コマンドを実行するには、1つの集約ルートに対して1つの小さな状態だけをロードする必要があります。データベースからの1つの非同期クエリによって容易に取り出すことができます。

  • 多くの異なるコレクションにクエリを格納すると、そのすべてのアイテムがドキュメント識別子で分離されます。したがって、システムプロセスは、メモリ内の読み取りモデルを維持する必要はありません。

+0

詳細を教えていただけますか? 「たくさんの異なるコレクションにクエリを格納する」と言うとき、データベースで意味しますか? – Sandy

+1

@Sandy一般的なケースでは、ストアは上位の抽象化層で表現され、データベースに依存しないようにする必要があります。読み取りモデルのエンティティは、aggragate listのような順序付けられたリストに分割することができるので、そのモデルの読み込み制限は、そのための最善の方法です。 SQLサーバーコレクションでは、テーブルがあり、ドキュメントは一意のGUIDを持つテーブル行であり、他の行やテーブルとの関係はありません。 mongodbではいくつかのGuid'edドキュメントで自然コレクションです (あなたが答えが好きなら、投票してください:) –

関連する問題