商品や商品のカテゴリを表示するウェブサイトを構築しています。データは、500kXMLファイルの形式で外部サービスから取得されます。WebサイトはASP.NET、C#です。
XMLは、カテゴリのリストとして構造化されています。各カテゴリの中には、いくつかの製品やその他のカテゴリが含まれている場合があります。
明らかに、この外部サービスを呼び出して、ページ要求ごとに大きなXMLファイルを取得することはできないため、数時間に1回呼び出して、キャッシュします。私はこのようなことをする必要があります:
- ページの左側に製品カテゴリメニューを表示します
- 選択したカテゴリのすべての製品を表示する
- 単一の製品に関する拡張情報を表示する
私の質問は次のとおりです。
まず、「DVD」カテゴリのすべての製品を表示するページで、次のことを行ったとしましょう(ページの読み込み時)。
XDocument allCategories = Cache["CategoriesXml"];
// loop through the XML and find the DVD category
// Get all products under it, then display them
カテゴリXMLをローカル変数(500kであることを思い出してください)に入れることで、それはサーバーの消耗ですか?ページが読み込まれるたびにこれを行う必要があることを忘れないでください。何千人もの人々が同時に異なるページを見ているかもしれません。1000人が数秒の間に同じページをロードした場合、このXMLファイルの1000個のインスタンスがメモリにぶら下がっていますか?それとも、ガベージコレクターがすべてを管理してくれますか?
キャッシュされたアイテムを直接ループする方が良いですか、それともパフォーマンスが低い(および/または悪い習慣)のでしょうか?
次に、XMLファイル全体をキャッシュすると言いました。そのXMLをループすることで、そのXMLから製品またはカテゴリを取得します(私はXMLよりもLINQを使用しています)。カテゴリタイプと製品タイプを作成し、それらを配列に入れて、それをキャッシュする方がよいでしょうか?次に、XDocumentではなくCategoryオブジェクトと配列をループしますか?よりパフォーマンスの高いものは何ですか?
第三に、このシステムをどのように設計するかという観点から、ベストプラクティスは何と言いますか。データアクセス層、ビジネスオブジェクト層、およびWebアプリケーションがあるとします。XMLを取得するには、外部サービスへの参照をどこに置く必要がありますか?どのレイヤーをキャッシュする必要がありますか?DAL部分が他のシステムによって実行されるという意味で、このアプリケーションにはデータアクセス層さえありますか?現在、私のDALはデータベースにアクセスするためだけにあり、そこにWebサービス参照を配置するのは間違っていると感じていますが、そうではないのではないでしょうか。ビジネスレイヤーでキャッシュを使用することは悪い習慣ですか(つまり、単体テストに干渉するなど)?キャッシュのためだけに、Webとビジネスレイヤーの中間層を検討しました。これは良いアイデアですか、それとも悪いアイデアですか。
私はすでにこのウェブサイトの大部分を終えました、実際-私は単に今それを振り返って、私がそれを最善の方法でやったかどうか疑問に思っています、それであなたの提案を私が実際にやったことと比較したいと思います、そしてうまくいけば私は戻ってそれを改善することができます。
ありがとう!