勉強日記

チラ裏

PoEAA ch17 Server Session State

martinfowler.com


Server Session State

Keeps the session state on a server system in a serialized form.

How It Works

  • 最も単純な形としては、アプリケーションサーバのメモリ上にセッションオブジェクトを持つ
    • セッションIDで引く連想配列
    • クライアントはセッションIDを保持し、サーバへのリクエスト時に渡す
    • サーバはセッションIDを受け取り、当該セッションのセッションオブジェクトを読み込む
  • 前提
  • 上記前提が崩れる場合は、もう少し複雑なパターンを導入することになる
  • メモリ容量問題
    • Server Session Stateパターンへのおもな反論のひとつ
    • 避けるためには、メモリ上で保持するのではなく、Memento (GoF)にシリアライズして永続化する
  • セッション情報をどんな形にシリアライズする
    • テキスト
    • バイナリ
テキスト バイナリ
コード量 多少は必要 ほとんど不要
human-readable yes no
サイズ
バージョニングの問題 なし あり
  • バイナリの場合、デシリアライズ先のクラスに変更・更新が加わるとデシリアライズ不可能になる
    • フィールドが1つ追加されたらもう駄目
    • 困ることはレアケース
      • 例: 無停止システムをクラスタリングしていて、アップデート時に新旧クラスが混在する場合など
  • セッション情報をどこに永続化する
    • アプリケーションサーバ自身
    • 外部の共通サーバ
      • ファイルシステムやDB
      • メリデメ
        • クラスタリングやfailoverをサポート
        • passivate/activateに時間がかかる
          • 【補】passivate: メモリ上のセッション情報を永続化し、メモリ上から削除
            • activateはその逆
          • 【補】リモートだから時間がかかるということ
      • 永続化先がDBの場合、Database Session Stateパターンとどう違うの
        • 線引きはあいまい
        • 著者は、セッション情報の保存の仕方で区別
          • Server Session State
            • Serialized LOBとして保存
          • Database Session State
            • 普通のレコードよろしく表形式で保存
  • 特に2Cのサービスの場合、ごみ掃除が必要
    • 長く残っているセッションを定期削除するdaemonを動かす?
      • セッション情報のテーブル上で競合をおこしてしまう
        • 【補】ロッキングが起きるということかな
    • Kai Yu氏のメソッド
      • セッション情報テーブルを12個にパーティショニング
      • 2時間ごとにローテーション
      • 全てのセッションは24時間で切れることになる
        • 問題になることはレアケース
  • 今日び(本書執筆当時)では、アプリケーションサーバ自身が自動的にセッションをサポートしてくれたりする

Java Implementation

.NET implementation

When to Use It

  • Session State系パターンの中で最もシンプル
    • たいていのケースにおいて、プログラミングほぼ不要
    • 自分で外部DBにセッション情報を出すにしても、データを表型に変換する(Database Session State)よりもSerialized LOB(Server Session State)のほうが楽
  • クラスタリングやfailoverをサポートするために自前実装が増えると、他のパターンより苦労するかも
    • 下記のような場合、他のパターンを検討する
      • セッション情報が少量
        • 【補】Client Server Stateパターンが適する
      • データを容易に表型に変換できる
        • 【補】Database Server Stateパターンが適する

英語

  • passivate/activate
  • contention
    • 競合
  • unceremoniously
    • 突然
      • 突然ログインが切れる、といった文脈