Sitecore Content SearchのEventQueueテーブルが過剰に更新されることによりパフォーマンスの低下が発生する


説明

Sitecore Content Searchのインデックスが頻繁に更新されると、Content ManagementおよびContent Deliveryサーバーの両方でパフォーマンスの問題が発生する可能性があります。

この問題が発生した場合の症状は、次の通りです:

  1. Sitecoreログ ファイルに以下のメッセージが出力される。
    ManagedPoolThread #5 04:44:59 INFO  Job started: Sitecore.Tasks.CleanupEventQueue
    Heartbeat 04:48:00 ERROR Exception in alarm clock event subscriber.
    Exception: System.Exception
    Message: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
    Source: Sitecore.Kernel
       at Sitecore.Data.DataProviders.Sql.DataProviderCommand.ExecuteReader()
       at Sitecore.Data.DataProviders.Sql.DataProviderReader..ctor(DataProviderCommand command)
       at Sitecore.Data.DataProviders.Sql.SqlDataApi.CreateReader(String sql, Object[] parameters)
       at Sitecore.Data.DataProviders.Sql.SqlDataApi.<CreateObjectReader>d__0`1.MoveNext()
       at Sitecore.Eventing.EventQueue.ProcessEvents(Action`2 handler)
       at Sitecore.Eventing.EventProvider.RaiseQueuedEvents()
       at Sitecore.Services.AlarmClock.Heartbeat_Beat(Object sender, EventArgs e)
    
  2. Coreデータベースで以下のクエリを実行すると、Number of entriesカラムに有意な値が返される。
    SELECT COUNT(*) as 'Number of entries'
    FROM [EventQueue]
    WHERE InstanceType='Sitecore.Data.Eventing.Remote.PropertyChangedRemoteEvent, Sitecore.Kernel, Version=7.0.0.0, Culture=neutral, PublicKeyToken=null'
    AND InstanceData LIKE '%last_updated%'

技術情報

この問題は、Sitecore Content Search機能によって、EventQueueデータベース テーブルにPropertyChangeRemoteEventレコードが過剰に生成されることに起因している可能性があります。

これは、Sitecore Content Searchがインスタンス固有の検索インデックスのメタデータを格納するために、Propertiesデータベース テーブルを使用することにより発生します(例えば、最後にインデックスが更新された時刻などが格納されます)。

Propertiesテーブルが変更されるたびに、PropertyChangedRemoteEventEventQueueテーブルに記録され、他の接続されているSitecoreインスタンスに対して、Propertiesテーブル周辺のキャッシング層を更新するよう通知します。

インデックスの更新が頻繁に実施されると、当該の挙動によって、キャッシュが過剰に再生成され、Content ManagementおよびContent Deliveryサーバーの両方にパフォーマンスの問題が継続して発生する恐れがあります。

解決策1

本問題を対処するための利用可能なオプションとして、次の解決策を実施することができます:

  1. Propertiesテーブルの変更がEventDisablerを遵守しない」記事の「解決策」節からパッチをダウンロードし、適用します。
  2. Sitecore.Support.417664.dll アセンブリを/binフォルダに配置します。
  3. Sitecore.Support.DatabasePropertyStore.417664.configファイルを/App_config/Includeフォルダに配置します。

パッチの詳細情報:

Sitecore Content SearchがPropertiesテーブルを使用して記録した情報はインスタンス固有であるため、他のSitecoreインスタンス間でプロパティ変更イベントを共有する必要はありません。このパッチは、EventDisablerを使用してEventQueueテーブルへの過剰なデータの入力を防止します。

解決策2

本問題を対処するためのもう1つのオプションとして、次の解決策を適用することができます:

  1. Sitecore.Support.417664.dll アセンブリを/binフォルダに配置します。
  2. Sitecore.Support.DatabasePropertyStore.417664.configファイルを/App_config/Includeフォルダに配置します。

パッチの詳細情報:

このパッチにより、Sitecore Content Searchはファイル ベースのプロパティを使用し、EventQueueテーブルにリモート イベントを記録しないようになります。関連の情報は、/<datafolder>/indexes/propertiesフォルダでファイルとして保存されます。