Sitecore のSharedとPrivateセッションプロバイダーにSqlSessionStateProviderを使用する

samatsu 2/1/2016 2472 N/A Sitecore XP

Sitecore 8.0 からコンテンツデリバリーサーバーが複数台構成(ファーム構成)の場合は、Session_Endイベントをサポートするセッション状態プロバイダーを使用する必要があります。Sitecore標準で提供されるInProc以外のセッションプロバイダーはMongoDBまたはSQL Serverを使用する2種類のセッション状態プロバイダーがあります。Sharedセッションに関しては、CDサーバーが複数台構成の場合は、InProcのセッションプロバイダーはサポートされないことも注意が必要です。

もう一つ重要な点として、Sitecore XPではいわゆるASP.NETのセッションに加えて、Sharedセッションという考え方が存在します。両者を区別するために、ASP.NETのセッションをPrivateセッションと呼んでします。

つまり、Sitecoreでは 従来から存在するPrivateセッション用のセッションデータベースと、Sharedセッション用のセッションデータベースが必要になります。

それぞれのセッションの目的についてはここでは説明しません。詳細は次のURLを参照してください。

Session state
https://doc.sitecore.net/sitecore_experience_platform/xdb_configuration/session_state

セッションが2つといってもSitecoreが標準で提供するセッションプロバイダーは1つのSQL Serverのデータベースもしくは1つのMongoDBのデータベースでPrivateとSharedセッションは共存できます。PrivateとShared用に接続文字列を分けることで、別々のSQLServerのデータベースもしくはMognoDBのデータベースをPrivate用およびShared用専用のセッションデータベースとして使用することもできます。

今回は、SQL Serverをセッションデータベースとして使用するように構成してみます。正式な手順は次のURLを参照してください。

Configuring session database servers
https://doc.sitecore.net/sitecore_experience_platform/xdb_configuration/configuring_session_database_servers

1.セッションデータベースの準備

Sitecoreのインストーラーを使用してSitecoreのデータベースをセットアップすると Sessionsという名前のデータベースが作成されます。そのデータベースがPrivateもしくはSharedセッションを格納するときに使用するデータベースです。今回はインストーラーを使用してインストールされるデータベースをそのまま使用します。

2.コンテンツ配信サーバーでの構成

ファーム構成の各CDサーバーでセッションプロバイダーの設定を実装していきます。手順は特に難しくはありません。

2.1 接続文字列の設定

コンテンツデリバリーサーバーのConnectionStrings.config を開き、sessionという名前でセッションデータベースへの接続文字列を設定してください。

例えば次ように設定します。接続文字列は適当ですので適宜変更してください。

 <add name="session" connectionString="user id=[ユーザー名];password=[パスワード];Data Source=[SQLInstance];Database=[xxxxxx_Sessions]" />

2.2コンテンツ配信でのセッションプロバイダーの設定

各コンテンツデリバリーサーバー(CDサーバー)のWeb.config と Sitecore.Analytics.Tracking.config で SqlSessionStateProviderを使用する設定を行います。

Web.configの<sessionState>..</sessionState> のセクションを見つけて、Sitecoreが提供するSqlSessionStateProviderを設定するようにします。

<sessionState mode="Custom" customProvider="mssql" cookieless="false" timeout="20" sessionIDManagerType="Sitecore.FXM.SessionManagement.ConditionalSessionIdManager">
  <providers>
    <add name="mssql" type="Sitecore.SessionProvider.Sql.SqlSessionStateProvider, Sitecore.SessionProvider.Sql" sessionType="Standard" connectionStringName="session" pollingInterval="2" compression="true"/>
  </providers>
</sessionState>

実際には、インストーラーを使用してインストールするとプロバイダーの定義はされているので、必要に応じて接続文字列などを変更して、sessionStateノードの modeを Customに、customProviderをmssqlに変更するだけでOKです。

続いて、 Sitecore.Analytics.Tracking.configの<sharedSessionState></sharedSessionState>ノードを見つけて、SqlSessionStateProviderの定義をprovidersに追加し、 defaultProviderに mssql を設定します。以下のサンプルは設定例です。

<sharedSessionState defaultProvider="mssql">
  <providers>
    <clear/>
    <add name="mssql" type="Sitecore.SessionProvider.Sql.SqlSessionStateProvider,Sitecore.SessionProvider.Sql" connectionStringName="session2" pollingInterval="2" compression="true" sessionType="shared"/>
  </providers>
   <!-- 省略 -->
</sharedSessionState>

プロバイダーに設定できるパラメーターの説明は、先頭の方で紹介した、Configuring session database servers のリンク先に説明が載っています。

3.動作確認

実際に、コンテンツデリバリーサーバーにアクセスすると SessionsデータベースのApplicationとSessionStateにレコードが追加されます。

Applicationには、SharedとPrivateを区別するためのレコードが2つ作成されていることが分かります。それぞれ、standardとsharedという名前が付けられています。

Applicationテーブルには、sharedもしくはstandardという名前のレコードが存在しない場合に自動的にGetApplicationIdプロシージャにより、レコードが作成されます。そのためIdは環境ごとに異なります。

SessionStateテーブルには次のようにプライベートと共有セッション用のレコードが挿入されます。プライベートか共有セッション化はApplicationのGUIDで区別され、Id列には共有セッションの場合はコンタクトのID、プライベートセッションのレコードにはセッションキーが使用されます。

4.まとめ

簡単ですが、SQLのデータベースを使用するセッションプロバイダーの設定例と登録されるセッションデータのサンプルをご紹介しました。