2011-07-17 1 views
1

この質問は、C#で大量にスケーラブルな&の効率的な顧客のセッション状態のクラスライブラリを書くことに関係しており、私は賢明な弁護士が切望しています。アーキテクチャC#/。NET 4.0のカスタムSessionStateプロバイダー/モジュール/ SessionItemsコレクションクラスLib?

私に基づいて、案内された元のスレッド:

I just discovered why all ASP.Net websites are slow, and I am trying to work out what to do about it

私がしよう(少数パワーナップで)過去48時間を費やしてきたように、このスレッドはバック冥府から呼び出すことができます希望ここで解明されたアイデアを実装するためには、私は解決策の空間でいくらか失われていることを認めなければならず、ある程度明快に感謝しています。

私はどこにいるのかを説明することを許可します&私は何を私に達成しようとしています&。バック&ここにJamesの&があります。ジョエルは素晴らしい点を挙げていますが、リンクを越えた具体的な実装は、私を暗闇の中にいくらか残しています。

私はいくつかのプロジェクトで、inprocのデフォルトのセッション状態オプションである& stateserverをバイパスするために使用できるクラスライブラリ/ dllを作成しようとしています。これは私にはいくぶん新しいので、私の無知を許してください。さらに&ダーティなasp.net/C#コーダーとジェネリックスのより微妙なニュアンス、スレッドセーフティ、ロック、シリアライズは私の小さな頭を傷つける傾向があります:))

アクセスに書き込むMSDNで見つけたサンプルに基づいてカスタムセージオン状態プロバイダを作成します。それから私はこのページを見つけて、パンドラの箱は広く開いていました。今、私はボトルの中にジニーを戻すことができません。私はもっ​​と掘り下げて、私はカスタムのセッションステートモジュールのテンプレートを見つけました。私もクラスライブラリに追加しました。だから私はプロバイダと自分のモジュールの両方を持っているし、ジョエルの多くのヒントを読んだ後、私はMSDNで見つけたさらに別のサンプルに基づいてカスタムセッション状態アイテムコレクションを作成しました。もともとHashListを基づいた

、何とか私はSortedListのにそれを回すことになった、そして私は、次のように関係して一つジョエルのステップ1に従っているように見える:で書き直さ

ロック(typeof演算)すべての.csファイルロック(thisLock)ここでthisLockは、ここに記載されているRicoの記事のように私有静的オブジェクトです...私はデッドロックの "概念"を理解していますが、これはasp.netサイトと私はまだジョーアーキテクトのような気がしていません。私はここで怠惰になる余裕がありません。なぜなら、揺れ動く基盤を構築して、道路上のバグを見つけ出すのは難しいだけです。

私は、ロックの "スリム"バージョンに関するジョエルの助言に従って、それを私のクラスライブラリでも働かせました。それでも私のクモの感覚は、私は基本的に啓発モードではなく従順モードであると私は話しています。つまり、私は知覚の分野で1秒間にの踊りのNEOスタイルビジョンを持っていません。

私はダンブラウン小説の難民のようにこのページに戻ってきます。そして今、私は、セッションステートアイテムのコレクションがスレッドセーフになるまで、ジョエルがマルチワールドで保証することはできないとアドバイスしています。だから私は、スレッドセーフなコレクションをブラッシュアップする時が来たと思います。

これはMSFTの記事をhttp://msdn.microsoft.com/en-us/library/dd997305.aspx SortedLists &に掲載していますが、他の古いものもありますが、ジェネリックのために推奨されていないようです。今私は実際にシリアライズ可能で、ショッピングカートに使用され、オフラインデータベースに格納されているビジネスレイヤーとlinqレイヤー全体を作成しました。

真実は、モジュール&の両方のモジュールを使用しているセッション状態です。スレッドセーフであり、デバッグするためのサンプルがないため、継続的にレッドラインがあり、ヒートシンクが揺れています。

MSFTは、「.NET Framework 2.0で導入されたコレクションクラスは、List、DictionaryなどのSystem.Collections.Generic名前空間にあります。これらのクラスは、型の安全性とパフォーマンスが向上しています.NET Framework 1.0クラスと比較して.NET Framework 2.0コレクションクラスはスレッド同期を提供せず、複数のスレッドでアイテムを同時に追加または削除する場合、ユーザーコードはすべての同期を提供する必要があります。

同時コレクションクラスは、.NET Framework 2.0コレクションクラスの型の安全性だけでなく、.NET Framework 1.0コレクションよりも効率的で完全なスレッドセーフティを提供するため、.NET Framework 4のコレクションクラスe .. "

だから、ジェームズ・ソルジャーが出口を抜けて、私はそれを得ていると言っていました。それはスレッドの終わりですが、私はデバッグ中にいくつかの非常に独特な動作を経験しました。

  1. 私はセッションライブラリをテストするためにハーネスWebサイトを使用しています。私がhttpmoduleとカスタムプロバイダの両方を指定した場合、モジュールはただちにハーネス/テストサイトで実行されます。しかし、実際の成熟したコードベースのweb.configを変更すると、プロバイダを選ぶことになります。

私は、ハーネスサイトがモジュールを使用しないことによって指し示すハーネスサイトを取得するために、一度に1つずつ使用できることを実感しました。

これは今のところ問題ありませんが、私は自分自身に「自分自身でカスタムコレクションを持っていますが、スレッドセーフですか?まだコレクションをロックしていますか?私の脳は、コレクション自体にカプセル化された「スレッドセーフティ」と言います。

そして、どのように私がこれらのすべての遅いpage.aspx/longpage.aspxサンプルが待っていなければならないのかたとえユーザーが欲求不満で別のリンクをクリックしたとしても(ウェブサイトで何が欲求不満なのか)...

だから、Bugs Bunnyのように、ラ・ベラ・ルナあなたに声をかけてください、 "ここに私を出す..."

私はこの件に関して、あなたのタイムリーな配慮をお寄せいただきありがとうございます。&その他の記念碑的な重要性。

ベスト、

ケーリーAbramoff、MCSD.NETは(.NET &の10年間、私はまだそれはすべてのjQueryの赤ちゃんだったらいいのに!)

答えて

0

は、あなたが本当に次何をする必要があるかのような音のテストを作成することですハーネスサイトの複数のページを同時に呼び出すプログラム。これにより、ロックが有効であるという状況がシミュレートされ、実装が論理的に正しいかどうかを判断するのに役立ちます。それがなければ、あなたはこの盲目的に働いていると思います。

希望に役立ちます。

私は現在、Redisの支援を受けているカスタムセッション状態プロバイダに取り組んでいます。私の計画は、ロックを解除できるようにする実装を行うことです。一度それが安定したら私はGithubでオープンソースになるだろう。

関連する問題