現在 .NET MemoryCache を使用している ASP.NET MVC アプリケーションがあります。MemoryCache は高速で効率的です。これは主に、データの複製やシリアル化を行わず、基本的にオブジェクトへの参照を格納しているためです。
最近、クライアントはスケーリングが必要であると判断しました。複数のプロセスで実行されたときのアプリケーションの動作をテストするために、Web 管理者は複数のワーカー プロセスを使用するようにアプリ プールを構成しました (いわゆる「Web ガーデン」モード)。キャッシュは、現在のリクエストを処理しているワーカー プロセスに応じて、異なる結果を返し始めました。
すべてのワーカー プロセスの MemoryCache インスタンスからキャッシュされたエントリを同期的にクリーンアップする簡単な方法は考えられませんでした (アプリのすべてのワーカー プロセスを列挙し、それぞれに対して "CleanUp" メソッドを呼び出すことができる IIS API はないようです)。アプリ インスタンス)。そこで、より本格的なもの、memcached に移行することにしました。これにより、後で専用の Linux サーバーにキャッシュを設定することもできます。
memcached をインストールして Enyim .NET クライアントを使い始めるのは簡単でした。しかし、MemoryCache で行ったようにすべてをすぐにキャッシュすることはできないという事実に行き詰まりました。次に、すべてをシリアル化する必要があります。最初は .NET BinaryFormatter (デフォルトで Enyim によって使用されています) を試しましたが、各オブジェクトに [Serializable] 属性が必要であり、すべてのコードベースをクロールしてすべてのオブジェクトを [Serializable] でマークするのに多くの時間を費やすことはできません。 . もう 1 つの問題 - BinaryFormatter のようにすべてのプライベート フィールドと props をシリアル化したくありません。BinaryFormatter は、他のすべての側面において、私たちが得ることができる最高のものです。
次に、有名な protobuf-net を試しました。申し訳ありませんが、マーク、しかし私たちにはうまくいきませんでした。メタデータ構成が多すぎます。
新しいリリースを展開するときにキャッシュを消去するだけでよいため、バージョン管理や後方互換性を備えたシリアライザーは必要ありません。さまざまな種類のキャッシュ可能なオブジェクトがたくさんありますが、あまりにも派手なものはなく、LINQ 式も、観察可能なコレクションも、ほとんどのシリアライザーにとって通常問題と思われる他の種類のオブジェクトもありません。
パブリックフィールドと小道具のみをシリアル化し、それらを効率的に保存するようにグローバルに構成できる、BinaryFormatterのシンプルだが本番対応の代替品はありますか(私は推測します-バイナリ)? 「初期化して忘れる」もの、属性やその他の種類のスキーマ定義を必要とせず、BinaryFormatter と同じ方法で nullables、enumerables、カスタム型、ボックス化されたオブジェクトを処理できるものは?