[Heroku]スティッキーセッションの有効化

herokuで、スティッキーセッション(セッションアフィニティ)を有効化するオプションが公開されたってことで、調べてみた。

dyno

herokuでは、dynoを増やしていく=ロードバランサとなって、アクセスの度にランダムにサーバを割り振られる。
なので、サーバ側に保持しているセッションは同一ユーザーのアクセスであってもページを遷移しただけでセッションが保持されていないサーバに割り振られてしまい、セッション切れを起こしてしまう、という問題がある。
これを解決していたのが主に、MemCachierというアドオンで、このMemCachier側にセッションを保持してやることでサーバが変わってもセッションを維持する、という流れで作成するのがセオリーだった。
(1Dynoだとサーバは一つなので必要ない)

スティッキーセッション

それを解決するのが、スティッキーセッション、セッション・アフィニティ、と呼ばれるもののよう。
これは、ロードバランサなどでサーバが数台ある場合に、特定のユーザーからのアクセスは特定のサーバのみに接続するように調整するもの、らしい。
なので、ページ遷移をしてもサーバが変わらず、セッションが切れる事がない、というわけ。
ただし、この設定で重要なのは、この同じサーバに割り当てる時間、の設定、とのこと。
長くするとロードバランサの意味がなくなっていくし、短くするとセッションが切れてしまう。
heroku上でこの時間を設定できるのかは今のところ不明。

スティッキーセッションの有効化と無効化

herokuでの設定

この機能はまだベータ版、ってことで、デフォルトではもちろん無効となっている。
有効にするには以下のコマンドを実行する必要がある。

$ heroku labs:enable http-session-affinity

検証

実際に検証してみる。
検証は、以下のサイトにあった、訪問回数をカウントする単純なものを使用してみた。
この回数がリロードの度に増えていけばセッションが引き継がれている、ということだが、
別サーバに接続されてセッションがなくなるとカウントがやり直しになったりする、はず。

第8回 セッションの仕組みを知ろう – PHP基礎講座

1
2
3
4
5
6
7
8
9
10
<?php
session_start();

if (isset($_SESSION["counter"])) {
  $_SESSION["counter"]++;
  print($_SESSION["counter"]."回目の読み込みです。");
} else {
   $_SESSION["counter"] = 0;
  print("はじめての読み込みです。");
}

1 Dyno

まず、Dynoを1で。
これは順調に増えた。当然の結果。

2 Dyno

dynoを増やしてみる。
何度かリロードしていると、10回目くらいで「はじめての読み込みです。」という表示が登場。
それ以降、何回かごとに別々のカウント数が表示される状態に。

セッションアフィニティ

で、この2Dynoの状態でセッションアフィニティをオンに。

1
2
3
4
$ heroku labs:enable http-session-affinity                                                    [ruby-2.1.2]
Enabling http-session-affinity for session-afinity-test... done
WARNING: This feature is experimental and may change or be removed without notice.
For more information see: https://devcenter.heroku.com/articles/session-affinity

アクセスしてみる。
100になるくらいまでリロードしてみたが、正常にカウント出来たいたので、きちんと同一セッションを見にいっていると思う。

注意

ただし、herokuをdeployするとセッションが切れてしまうのは変わらないようなので注意が必要。
また、ベータ版の機能となるので、これに頼った実装はまだ早いと思われる。

参考

Heroku | Introducing Session Affinity
Heroku Labs: Session Affinity | Heroku Dev Center

   このエントリーをはてなブックマークに追加