2017-02-16 14 views
4

私は特に、ユーザおよびグループのデータを照会し、その後のためにAPI内のエンドポイントを提供するために、自分の組織のActiveDirectoryので統合サービスを提供する必要がREST APIを書いていますオートコンプリートフィールドクエリ。C#のウェブAPI - ストアとメモリ内キャッシュ内のデータを永続化

私の組織のActiveDirectoryは非常に大きく、約130,000のユーザーオブジェクトとグループオブジェクトが結合されています。

これらのオブジェクトのすべてを照会し、私たちの現在のバッキングストア(MongoDBの)に格納するには、約40分かかります。

私たちは、モンゴの使用をスキップし、Web APIのメモリで照会ADのすべてのオブジェクトを格納するオプションがあるかどうかを確認することを決めました。

私は、IISアプリケーションプールがリセットされるたびにその中に格納されているデータが失われ、その後APIが約40分間データを提供できないため、シングルトンは機能しないことに気付きました。起こることはできません。

私はまた、名前空間System.Runtime.Cachingを指しthis質問を見ました。しかし、名前空間によって提供されるMemoryCacheも、IISアプリケーションプールのリセット時にすべてのデータを失います。

私の質問は、Web APIメモリ内にADからのデータを格納するためのソリューションが他にありますか?現時点では、情報を保持するために永続ストア(リレーショナルまたはドキュメントDB)を使用しないようにしたいと考えていますが、実行可能なソリューションが表示されない場合は、Mongoに固執する可能性があります。

答えて

1

インメモリは、スケーラビリティスタンドポイントから悪い計画のように聞こえます。 APIの負荷を分散したい場合は、このデータの複数のコピーがインメモリに存在する可能性がありますが、APIの1つのインスタンスが要求または別のインスタンスを処理するときに、結果が異なることがあります。

おそらくリストを推測し、おそらくは辞書を推測します。 Redisサーバーは複数のノードをサポートし、メモリにデータを格納します。キー値のペアを<string, string>として保存するという点で、辞書と似ています。 APIのすべてのインスタンスが同じRedisクラスタを指すことができるため、一貫性、規模およびパフォーマンスを得ることができます。

また、あなたはステートフルとステートレスのサービス間で状態を共有することを可能にする特別なコレクションを持っているサービスファブリックを検討することができます。 Redisのように、データはシリアル化され、Service Fabricクラスタ全体に格納されます。非常にフォールトトレラントで、HAとDRが組み込まれています。そう、それはあなたが今、将来的に必要なものもよるが

何もパフォーマンスの面でシングルトン辞書を破っていないでしょう。

+0

注: 'ConcurrentDictionary' –

関連する問題