今まで、HTTPセッションを使う中で、考えていた事

何か謎のメモ書きを見つけたので、余り深く考えずにそのままエントリにしてしまう事にした。


そもそも、HTTPの上でステートフルなアプリケーションを作ろうとする事自体に、
一定の矛盾がある事を忘れてはいけない。
HTTP以外の方法使ってもイイんなら、そっちの方が良いケースの方が多いよ。


ほんとにステートフルアプリケーションなの?
ステートレスなアプリケーションじゃないの?
んで、ステートは、サーバで持つの?クライアントで持つの?


HTTPを使わざるをえず、ステートフルアプリケーションであり、
ステートはサーバで抱えるなら、HTTPセッションだよね、って話。


で、正しい答えは分らないのだけど、大体いつもこんな感じの事を考えてる。

  • 最大でどの程度の量の情報を抱えるのか?
  • シリアライズ化コスト
  • レプリケーション*1
  • ロードバランシング(クラスタリング)
  • 「WebサーバとAPサーバ」みたいな構成にするかどうか。
  • 「ハードウェア増設する条件と頻度と計画」的な話
  • 無効化のタイミング
    • セッションタイムアウト
    • JavaのHttpSessionは、Invalidateしても即メモリが解放される訳じゃない事*2
  • 負荷の傾向
    • 最大/最低同時アクセス数/日
    • 最大/最低ユニークユーザ数/日
    • 負荷の極端なばらつきが無いか?
  • プロセスの再起動は可能な構成にしてあるか?

まぁ、何か色んなモノがごっちゃになってるし、何か抜けてる感がさもありなん。


あんま難しい事考えなくても、メモリイッパイ積めば、いいじゃんって話も忘れない様に。
64bit対応OSなら、テラバイト単位で積めるよ?マジデメモリテラツメルス。
普通のブレードサーバでも、32ギガバイトとか積めるよ?
でも、メモリ積み過ぎると、FullGC怖いよ?忘れないデ。
CPUイッパイあるからって、GCが速いとは限らないよ。
場合によっては、遅くなるかもしれない。
あんまし真面目にテストした事無いし、
手元にそういう資料が無いのでホントの事は分からないケドネ。


後ね、デカいハードを仮想化して、小さいサーバを沢山ならべる構成にした方が、
パフォーマンスが出るアプリケーションもあるかもよ。

*1:分散処理の基本は、分散しない事だって、誰か偉い人が言ってた希ガス。

*2:つまり明示的なログアウト機能は突き詰めると実装不能