2017.01.01ASP.Netのセッション変数をmemcachedに変更してみようという試みです。目次ASP.Netでのセッション変数InProcメリットデメリットStateServerメリットデメリットSQLServerメリットデメリットOffCustomメリットデメリットmemcachedを使うとりあえずひな形memcachedクライアントを用意する接続するSessionStateStoreProviderを実装するISessionStateItemCollectionマルチスレッドMSDNWeb.configを設定する最後にASP.Netでのセッション変数まずASP.Netのセッション変数での扱いをおさらいします。ASP.Netでは大きく4パターンあります。InProc対象のアプリが稼働しているアプリケーション(IIS)のメモリ内にセッション情報を保存します。メリット初期設定であり、他に用意するものもなくとてもお手軽にセッションを扱えます。格納対象がSerializableでなくてもよかったり一番制約が少ないです。シリアライズされない上にローカルのメモリに入れるので速度も一番速いと思われます。デメリット各サーバー毎のローカルなメモリ内に情報を格納する為、水平分割するとクライアントとサーバーを1対1で紐づける必要が出てきます。その為バランシングに高機能なロードバランサーが必要になってくる上、分割の効果が下がります。冗長確保しているにもかかわらずいずれかのサーバーが死ぬとそこにセッションを持っていたユーザーはセッション情報を失う事になります。IISはアプリケーションを定期的に再起動かけるためそのタイミングでどちらにしろセッション情報を失ってしまいます。基本的にこれは小規模もしくは開発用のアプリケーションに向いていると言えます。Serviceにセッション情報を格納します。メリットWEBサーバーとセッション管理が分離される為、フロントがバランシングされても特に問題がなくなり、さらにフロント側で障害が発生してもセッションを維持する事が出来ます。デメリット当たり前ですが、1台で構成したら単一障害点になります。InProcの場合はサーバーが1台死んでも一部のユーザーのセッションが途切れるだけで再度つなぎなおすと大丈夫ですが、コチラはすべてのユーザーが影響をうけ、しかも復帰しない限りすべてのサービスが不能になります。ところがどうもこの設定では冗長化が出来ないようです。上げるとスタンバイを置いてすぐに差し替えて影響範囲を抑えるくらいでしょうか。Serverにセッション情報を格納するようにします。Serverと基本的には同じです。Serverと違い冗長化が可能です。Serverとまったく同じ手段で可能です。デメリットやはり構築が面倒になります。冗長用にクラスタリングを組んだりすると構築の手間が増えます。サーバーの料金面でも高くなりがちです。現状挙げた3つの中では一番パフォーマンスが良くないです。Offセッション管理をしません。メリットもデメリットもくそもありません。セッション管理は何もできません。Custom独自のセッション管理システムを導入します。SessionStateStoreProviderと呼ばれるクラスを自分で実装する必要があります。メリット実装の如何で好きに出来ます。デメリット実装コストが高いです。実装の仕方によってパフォーマンスに直結します。memcachedを使う今回はセッションモードをCustomにして保存先をmemcachedにします。それにあたってまずはASP.Net上からmemcachedへアクセスできるようにします。</body></html>初期設定InProcで動いてます。これにまずmemcachedにアクセスする処理を追記し、アクセスできることを確認してからSessionStateStoreProviderを実装しようと思います。memcachedクライアントを用意する(古いけど)何個かmemcachedの.Net用のクライアントライブラリはあるようです。その中でnugetにあったのが、NMemcachedなのでこれを利用したいと思います。NMemcached.Client接続するmemcachedのサーバーは稼働済の前提で進めます。</body></html>とっても簡単です。SessionStateStoreProviderを実装するmemcachedへの接続が出来ることは確認できたので本命のSessionStateStoreProviderを実装します。これには用意されているSessionStateStoreProviderBaseクラスを継承したクラスを用意し、そこに必要なメソッドを実装していきます。}}とりあえず継承させるとこんな感じです。次に必要なメソッドを順次実装します。データを更新しつつ排他を解放する。セッション変数が変更された場合に呼び出される。変更されていない場合はReleaseItemExclusiveが呼び出される。}}ながーくなりました。半日くらいでサクッと作りました。確認していないのと有効期限を考慮していない為不十分ではありますが、とりあえず動きます。実際サービスに利用するには厳しい出来だと思います。留意が必要な項目としてはISessionStateItemCollectionこれはSession[“”]でセッション変数を操作するときの本体です。ISessionStateItemCollectionを実装すると必然的にNameObjectCollectionBaseを継承する必要が出てきます。継承した後はNameObjectCollectionBaseのBase***メソッドを利用してコレクションを操作します。マルチスレッド次に気を付けるべきがマルチスレッドのようです。このインスタンスはマルチスレッドで呼び出される為、それを考慮した実装が必要です。Exclusiveがついた名前のメソッドでは独自の排他処理を自前で行う必要があります。今回はとりあえずManualResetEventで適当に実装してます。(MonitorとかMutexだと上手くできないので)MSDN一応この辺のメソッドで実装する内容はMSDNに記載があります。Web.configを設定するセッション管理をこのプロバイダを利用するように設定します。Web.configの<system.web>内に以下を記述します。</sessionState>大事なのはmodeとproviderです。customProviderにはその直後のproviders内のnameを指定します。providersではtypeにクラスの名前をパッケージ込みで指定します。理想は完全修飾名ですが、とりあえず解決さえできれば大丈夫です。最後にCustomプロバイダーは割と実装面倒だなーという感想です。あとはmemcachedのクライアントもあまり無いのもネックです。......ここまで書いといて何ですが、実はmemcached用のSessionStateStoreProviderはnugetに存在していますので、そっちを使った方が良いと思います。2対応(※5.3追記)以前uGUIでメッシュ描画する記事書きましたが。Unity5.2頃から仕様変更されました。いうわけで、どのような手順で変更に対応するかをざっくり書いておきます。コチラに以前の記事と合わせて統合し...C#【チュートリアル】uGUIとPhysics2Dでシューティングを作ってみる今度は簡単な2Dシューティングゲームを作りたいと思います。今回もプログラム経験が浅い人向けに気を付けたいと思います。コチラの記事も参考にしてください。今回は超簡単な2D縦シューティングゲームを作りた...C#Unityのシステムフォントの注意点Unity4.5やらの時代で開発していたときの話なので、もしかしたら事情が変わってるかもしれません。Unityではフォントを指定する際にArialを指定する事でシステムフォントを利用できます。システムフォントは全ての端末に間...C#uGUIのボタン機能を使うuGUIでのボタンの配置は大きく2通りありますが、どちらもそこまで難しくありません。Buttonコンポーネントは...ASP.NetASP.Net触ってみたずっと気になってたASP.Netをさわってみました。Frameworkで動くウェブアプリケーションの環境です。前の記事でuGUIの自分で作ったクリック判定の調整作業をざっくり書きました。これには課題点がありました。ツイートタイトルとURLをコピーしました。