PowerCMS X ブログ

2024-12-12

再構築トリガーの処理に時間がかかるとき不要なファイル再構築のムダを省く

PowerCMS Xでは再構築トリガー(またはコンテナ)による関連ファイルの再構築を柔軟に設定することができますが、トリガーの設定をあまり多くしてしまうとオブジェクトの更新後の関連ファイルの再構築処理プロセスが溜まってしまうことがあります(結果、サーバーの負荷が上がる)。

頻繁に複数ユーザーがサイトを更新する環境では同じ内容で同じファイルの再構築が走る

PowerCMS Xでは、オブジェクトの更新が行われると、必要な再構築トリガーが引かれてバックグラウンドで再構築処理が行われます。PowerCMSでは、リダイレクトによって関連するページが再構築されます。この時、複数ユーザーがほぼ同じタイミングで別のオブジェクトを更新した時の処理は、以下のようになります。

ほぼ同じタイミングでオブジェクトを更新した時の動き。同じファイルに対する再構築が走る

  • ユーザーAが記事の操作を行う
  • 記事ページが再構築された後、関連する4ページが順番に再構築される
  • ユーザーAの操作の直後にユーザーBが別の記事の操作を行う
  • 記事ページが再構築された後、関連する4ページが順番に再構築される
  • この時、ユーザーAの操作後の再構築にユーザーBの記事の操作の結果が反映されることがある(が、再度再構築が走る)

このような状態で複数のユーザーが異なる記事やページなどのオブジェクトを更新するような運用をしていると、終了していないPHPのプロセスが重複して起動している状態になり、使用メモリが増えていくことがあります。

「Shared Background Publishing」を利用する

解決策の一つとして「Shared Background Publishing」(取得済み特許) を利用する方法があります。

詳細はリンク先をご覧いただくとして、設定を有効化すると動作は以下のように変わります。後に操作したユーザーが前に操作したユーザーのキューを奪う(バトンタッチ)することで同じファイルの再構築を後に操作したユーザーだけがまとめて行う、ということになります。

  • ユーザーAが記事の操作を行う
  • 記事ページが再構築された後、キューに入れて一定時間待機する
  • ユーザーAの操作の直後にユーザーBが別の記事の操作を行う
  • 記事ページが再構築された後、関連する4ページ分のユーザーAの待機キューをユーザーBにバトンタッチする
  • ユーザーBの処理で順番に再構築される

代案 : ファイルのタイムスタンプのチェックによって再構築をスキップする

  • この機能 (しくみ) は次のバージョンアップに含まれます (特別な設定は不要です)。

次のリリースで改良した処理になります。ユーザーBの記事の操作後に、ファイルのタイムスタンプをチェックして別のユーザーによって当該関連ファイルの再構築が行われていた場合、再構築をスキップします。以下のような流れとなります。

  • ユーザーAが記事の操作を行う
  • 記事ページが再構築された後、関連する4ページが順番に再構築される
  • ユーザーAの操作の直後にユーザーBが別の記事の操作を行う
  • 記事ページが再構築された後、ファイルのタイムスタンプをチェックして、別のプロセスがファイルを更新していたら再構築をスキップする

ほぼ同じタイミングでオブジェクトを更新した時の動き。同じファイルに対する再構築はスキップされる

これによって、オブジェクト更新後に別のプロセスが当該ファイルを再構築していた場合、処理そのものをスキップできるようになります。オブジェクトの更新後、トリガーの開始時間で比較しているので、別のプロセスの再構築処理にユーザーBの操作の結果は含まれていることになります。

注意事項・制限事項

唯一の例外は、ファイルに更新がなかった時です。「記事本文のみに修正が入っていて、タイトルや日付はそのまま」といった場合、一覧ページの内容には変化がないかもしれません。

この時、PowerCMS X(PowerCMS)は再構築処理そのものは行われますが、ファイルの更新は行われません。これには、ファイルのタイムスタンプが更新されることで、Conditional GET(HTTP 条件付きリクエスト)が効かなくなるのを防ぐ目的があります。要するに、ブラウザキャッシュが使われないのです。

もしも、静的ページへのリクエストを高速に捌ける環境で、ブラウザキャッシュよりもサーバーの再構築負荷を何とかしたいということであれば、ビュー(テンプレート)にタイムスタンプ「 <!--<mt:date format="YmdHis">-->」などのコメントタグを入れておけば、確実にファイル書き出しが行われます。

「Shared Background Publishing」にはこの制限がありません。必要に応じて設定するようにしてください。

カテゴリー:技術情報 | リリース&アップデート情報

投稿者:Junnama Noda

ブログ内検索

アーカイブ