Sitecore Experience Platformは、コンテンツ配信の処理におけるMongoDBの接続に問題が発生しても、その影響を最小限に抑えられるように設計されています。
例えば、送信キューはキャプチャされたデータをローカルのハード ディスク ドライブに書き込んでおき、Collectionデータベースがオンラインに復帰した際に、そのデータをMongoDBに送信します。この処理の詳細につきましては、本記事の「送信キューの技術的詳細」の節をご参照ください。
ただし、ある種のMongoDBが利用できないユース ケース シナリオでは、Sitecoreソリューションに大きな影響を及ぼす場合があります。この記事では、いくつかの既知のMongoDBの問題と、それらに対する推奨される解決策を記載します。
アナリティクスAPIがカスタム コードの実装で直接使用されており(例えばレイアウトでのコンタクトの識別など)、かつMongoDBが利用不能の場合、例外がSitecore APIによってキャッチされません。
解決策: カスタム コードは、アナリティクスAPIによってスローされうる例外も、(例えば、try-catchなどを利用して)処理する必要があります。加えて、xDBが完全に、または部分的に無効化された場合の状況も考慮に入れていただくことをお薦めします。
Sitecoreサイトが高負荷に晒されている場合、xDBは大量のデータをMongoDBに読み書きします。
これにより、MMAPv1 ストレージ エンジンが使用されている場合、データベースおよびコレクション レベルでのロックに加え、いくつかの完全には最適化されていないクエリの処理が原因で、パフォーマンスの問題が引き起こされる場合があります。
MongoDB 2.6では、多くの読み取り・書き込み操作で個別のデータベース単位でのロックが使用できます。
MongoDB 3.0(MMAPv1)では、大きな改善点として、コレクションレベルのロックが使用できるようになりました。以前のバージョンでは、利用可能な最も細かいロックはデータベース ロックでした。
解決策: 貴社Sitecore XPバージョンでサポートされている、利用可能な中で最も新しいMongoDBバージョンにアップグレードすることをお薦めします。加えて、実施可能な場合にはいつでもWiredTigerストレージ エンジンに切り替えることをお薦めします。これは、パフォーマンスに多くの改善点があり、かつドキュメントレベルでの並行処理制御ができるためです。
時折、MongoDBが利用可能でも、リクエストがタイム アウトになってしまう場合があります。これが起きた場合、アナリティクスAPIといくつかのSitecore XP APIはデフォルトで接続のタイムアウトまで30秒間待機します。これはページの読み込み時間を増加させます。
解決策:
註: 接続文字列では、以下の文字を使用してパラメータを区切ることができます。
もしこれらのいずれかで区切ると設定エラーが起きる場合は、他の文字をお試しください。
MongoDB .NETドライバーがMongoDBサーバーへの接続に失敗すると、Sitecore XPがMVCページで「Tracker.Current is not initialized」エラーをスローすることがあります。
例:
ERROR Application error.
Exception: System.InvalidOperationException
Message: Tracker.Current is not initialized
Source: Sitecore.Analytics
at Sitecore.Analytics.Pipelines.StartAnalytics.StartTracking.Process(PipelineArgs args)
at (Object , Object[] )
at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args)
at Sitecore.Analytics.Pipelines.StartAnalytics.StartAnalyticsPipeline.Run()
at Sitecore.Mvc.Analytics.Pipelines.MvcEvents.RequestBegin.StartTracking.Process(RequestBeginArgs args)
at (Object , Object[] )
at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args)
at Sitecore.Mvc.Pipelines.PipelineService.RunPipeline[TArgs](String pipelineName, TArgs args)
at Sitecore.Mvc.Routing.RouteHttpHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
解決策: 以下のページに掲載されているパッチをダウンロードし適用してください。
https://github.com/SitecoreSupport/Sitecore.Support.147407/releases
xDBが無効化されており、かつトラッキングが有効化されている場合、Sitecore XPがMVCページのエクスペリエンス エディタで「Tracker.Current is not initialized」エラーをスローすることがあります。
例:
ERROR Application error.
Exception: System.InvalidOperationException
Message: Tracker.Current is not initialized
Source: Sitecore.Analytics
at Sitecore.Analytics.Pipelines.StartAnalytics.StartTracking.Process(PipelineArgs args)
at (Object , Object[] )
at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args)
at Sitecore.Pipelines.DefaultCorePipelineManager.Run(String pipelineName, PipelineArgs args, Boolean failIfNotExists)
at Sitecore.Analytics.Pipelines.StartAnalytics.StartAnalyticsPipeline.Run()
at Sitecore.Mvc.Analytics.Pipelines.MvcEvents.RequestBegin.StartTracking.Process(RequestBeginArgs args)
at (Object , Object[] )
at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args)
at Sitecore.Pipelines.DefaultCorePipelineManager.Run(String pipelineName, PipelineArgs args, String pipelineDomain)
at Sitecore.Mvc.Pipelines.PipelineService.RunPipeline[TArgs](String pipelineName, TArgs args)
at Sitecore.Mvc.Routing.RouteHttpHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
解決策: 以下のパッチをダウンロードして適用してください。
https://github.com/SitecoreSupport/Sitecore.Support.122492/releases
MongoDBが利用できない場合でも、Sitecore XPはアナリティクス データの収集を続行し、Collectionサーバーがオンラインに復帰するまで、データをファイル システムに格納します。
\App_Config\Include\Sitecore.Analytics.configファイルに、MongoDBが利用不能の場合のSitecore XPの挙動を制御するキーがあります。
<!-- ANALYTICS FAIL ON DATABASE ERRORS
Note: This is a diagnostics setting that should not be enabled on a live system.
If set to true, web pages crash and show exception details in case
an operation cannot access the database.
If set to false, exceptions are suppressed and logged, and visit data
is queued until the database is back up. See <submitQueue> section.
Default: false
-->
<setting name="Analytics.FailOnDatabaseErrors" value="false" />
この設定は、\App_Config\Include\Sitecore.Analytics.MongoDb.configファイルの<mongo>セクションで使用されています。
<mongo recoveryTimeout="60">
<driver type="Sitecore.Analytics.Data.DataAccess.MongoDb.MongoDbDriver, Sitecore.Analytics.MongoDB">
<param desc="connectionString">$(0)</param>
<param desc="failOnReadErrors" ref="settings/setting[@name='Analytics.FailOnDatabaseErrors']/@value" />
</driver>
</mongo>
Sitecore XP 8.1から、この設定は廃止されました。以降のバージョンでは、<mongo>セクションで直接この設定を制御できます。
<mongo recoveryTimeout="60">
<driver type="Sitecore.Analytics.Data.DataAccess.MongoDb.MongoDbDriver, Sitecore.Analytics.MongoDB">
<param desc="connectionString">$(0)</param>
<param desc="failOnReadErrors">false</param>
</driver>
</mongo>
また、Sitecore XP 8.1から、\App_Config\Include\Sitecore.Analytics.Tracking.configファイルの設定で、送信キューを有効化・無効化できるようになりました。
<!-- ANALYTICS USE SUBMIT QUEUE
Specifies if the submit queue should be used when the contact or session submit operations cannot access the database.
If set to true, the contact or session is queued until the database is backed up (see the <submitQueue> section).
Default: true
-->
<setting name="Analytics.UseSubmitQueue" value="true" />
収集したデータをMongoDBに流すバックグラウンド タスクについては、\App_Config\Include\Sitecore.Analytics.Tracking.Database.configファイルで設定できます。
<submitQueue> <backgroundService type="Sitecore.Analytics.SubmitQueueService, Sitecore.Analytics"> <!-- Service wakeup interval in seconds. --> <Interval>60</Interval> </backgroundService> </submitQueue>