パーシステンス
パーシステンス(英語:persistence)とは、直訳すると「存続」という意味である。
目次
概要
ウェブの世界でパーシステンスという場合は、ロードバランサーを咬ました複数台のHTTPサーバーでセッションを共有するためのセッションサーバー、およびその構築方法を指す。明示的にセッション・パーシステンスなどと記載している事例も見受けられる。
ハードウェアで対応
パーシステンスの主な実現方法としては高性能なロードバランサー製品を用いる方法がある。高性能なロードバランサー製品には接続は同一のHTTPサーバーにだけ接続しつづけるという機能が付いている。これを使えば共有セッションを保持するサーバーを用意しなくても個々のサーバー内で完結できる。またアプリケーション側での対応が不要であるためプロプライエタリなものや、プログラムの改変をしている場合じゃねぇデスマーチに陥った案件などでは活躍する。
アプリケーションで対応
アプリケーションでパーシステンスに対応する方法としてはデータベースにセッションを保存するという方法がある。この際に用いるデータベースは一般的なRDBMSでもよいが、セッションという単純なデータ構造、かつ頻繁な読み書き、かつスケールアウトしたい要件ではRedisなどのNoSQLを用いるのが現実的である。
PHP: memcached
PHPではセッションの保存先にmemcachedを指定できる。memcachedを別サーバーにすることでHTTPサーバーをDNSラウンドロビンで単純に複数台設置しても簡単に対応できる。
php.iniで設定するのが手軽である。
session.save_handler = memcached // コメントアウトをはずす session.save_path = "tcp://localhost:11211" // 追記
ASP.NET: ASP.NET State Service
Windows ServerにIISを入れると「ASP.NET State Service」というサービスが出来上がる。これはIISの一部なのでWindows Serverでなければ利用できない。このため開発機が普通のWindowsであったり、Monoや.NET Coreなどへの対応を考慮すると極めて非推奨である。
サービスを立ち上げてWeb.configのsessionStateに以下のような設定を加えることで利用できる。
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<system.web>
<sessionState mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
stateNetworkTimeout="10" />
</system.web>
</configuration>
ASP.NET: RedisSessionProvider
マイクロソフトはRedisでセッションを監理するライブラリ(セッションプロバイダー)をオープンソースとして公開している。
マイクロソフトの意図としてはAzureでのAzure Redis Cacheを利用したセッション監理を想定したものだと思われるが、普通にローカルにRedisサーバーを立ち上げても利用でる。Redisなのでプラットフォームに依存せず、スケールアウトもする。現状でもっとも推奨される方法であると思われる。
利用にはNuGetから入れられるのが手っ取り早い。
- Microsoft.Web.RedisSessionStateProvider
- https://www.nuget.org/packages/Microsoft.Web.RedisSessionStateProvider
設定方法はマイクロソフトの公式サイトに日本語の資料があるのでこれを見るのが手っ取り早い>。