4

現在LINQ-to-SQLを使用しているASP.NETMVCフレームワークとSQLServerのユーザーに満足しています。これは、月に約140万人のユーザーと200万人以上のアクティブなユニーク数を持つ消費者向けアプリケーションで私たちのニーズを十分に満たします。

すべてのユーザーアクション(記事の表示、サイトでの検索など)のログ記録を開始するのはかなり遅れており、そのための適切なアーキテクチャを調査しようとしています。

アーカイブシステムは、本番記事と検索エンジンを格納するメインのSQLクラスターの一部ではなく、独自のエンティティである必要があります。最初は1つのボックスから始めて、独自のSQLクラスターにする必要があります。

問題を単純化するために、これらの数百万人のユーザーがその月にサイトに入力した検索用語をログに記録したいとします。これは、サイクルを最小限に抑えた方法で行います。

私の質問:(1)検索語をリモートボックスにダンプする非同期の方法はありますか?LINQはこれに対して非同期をサポートしていますか?

(2)たとえば1,000(userId、searchTerm、date)のログ項目のキャッシュをRAMキャッシュに構築し、それらを定期的にデータベースにフラッシュすることをお勧めしますか?この方法では、オープン/クローズ接続が削減されると思います。

それとも私はこれを完全に間違っていると考えていますか?実装のしやすさと堅牢性のバランスを取りたいと考えています。

4

2 に答える 2

0

1)もちろん、それを達成するためのさまざまな解決策があります。Linqは必要な楽器ではありません。2)これを行っても大きな改善はないはずです。「ロギング」は検索が実行されたときにのみトリガーされます。大したことではなく、1回ではなく2回の呼び出しになります。

提案はAOPを使用することです

Postsharpを使用して、ロギング用のクリーンで別個のレイヤーを作成できます(ただし、他の方法もあります)。次に、アクションに渡される内容をトレースする必要がある場合にのみ、必要なロギング属性でアクションを装飾します。このアプローチの主な利点は次のとおりです。

  • ロギングロジックはコード内にありませんが(メソッドコードを変更する必要はありません)、メソッドの前後に実行されます。
  • ターゲットメソッドからのアスペクトのクリーンな分離。
  • アスペクトのオン/オフを簡単に切り替えることができます

AOPは、ロギングや認証など、複数のメソッドに追加できる動作に関しては特に一般的な方法です。そして、はい、それは非同期の方法で使用することができます。

于 2012-01-06T14:14:02.103 に答える
0

1)HttpModuleユーザーが使用するすべての検索用語を「キャッチ」するものを作成することをお勧めします。これらの情報をどこにどのようにダンプするか(SQLボックスを使用すると言った)は、モジュールの範囲外の別の問題であり、検索範囲をキャッチする必要があります。次に、ログインを含むコンポーネントを作成して、非同期呼び出しを使用してこれらの情報を保存できます(またはLog4Netなどのサードパーティコンポーネント)。

2)格納する必要のあるすべての情報をキャッシュする一種のバッチ挿入を作成し、ある時点でそれらをSQLMSMQまたはサポートする他のテクノロジにダンプするReliability場合:次の場合は、これらの情報をすべて失いたいと思います。システムクラッシュなど

于 2012-01-06T15:06:07.547 に答える