• Emacs と Perl を使って,XML-RPC 経由で Movable Type のエントリを編集するツールを配布しています.良かったら持っていってください.( 2004/10/24 update) mapae logo
  • Movable Type で footnote*1 を生成する plugin を配布しています.良かったら持っていってください.( 2004/03/04 update )
  • その他の配布物等

*1: 脚注.よ〜するに,こ〜ゆ〜やつです.

TrackBack の待ち時間を短くする

| コメント(0) | トラックバック(0)

Movable Type では,TrackBack 受信時にインデックスページしか再構築されません.従って,アーカイブページ *1には TrackBack が反映されません.Movable Type 自体にアーカイブページの再構築処理を追加すれば反映させることが出来ますが,処理完了を通知するまでに時間がかかり,タイムアウトが起きやすくなってしまいます.

そこで,再構築のプロセスを分離しバックグラウンドで処理させることにより,処理完了の応答を早く返せるようにしてみました.

はじめに

Movable Type では,TrackBack 受信時にインデックスページしか再構築されません.従って,アーカイブページ *2には TrackBack が反映されません.Movable Type 自体にアーカイブページの再構築処理を追加すれば反映させることが出来ますが,処理完了を通知するまでに時間がかかり,タイムアウトが起きやすくなってしまいます.

そこで,再構築を別のプロセスに分離しバックグラウンドで処理させることにより,処理完了の応答を早く返せるようにしてみました.再構築の対象は,TrackBack 受信時に標準で再構築されるページだけでなく,エントリ登録時に再構築されるものと同じです.また,再構築プロセスの起動数を制限することにより,同時に複数の TrackBack を受信したときでも,システム負荷が高くなり過ぎないようにしてみました.

制限事項

tb-rebuild.pl には以下の制限事項があります.

  • fork, symlink が使えない環境では動きません.
  • flock が使えない,または正しく作用しない環境では正しく動きません. *3
  • プロセスの実行時間に制限がある場合,再構築が完了しないエントリがでる可能性があります *4
  • mod_perl 環境ではどう動くか私にはわかりません.
  • 再構築中のエラーは捕捉できません *5
  • 処理完了の応答後も再構築処理が継続している場合があるので,ページに反映されるまですこし時間がかかることがあります.

配布

毎度のことですが,tb-rebuild.pl の利用によって発生した損害等の責任は,私は負いませんので,各自の責任において利用してください.tb-rebuild.pl の著作権は主張しますが,改変,再配布等は自由にしていただいて構いません.

導入

tb-rebuild.pl を plugins ディレクトリに置いてください.次に,mt.cgi と同じディレクトリに「tb-rebuild」 *6というディレクトリを作成します.このディレクトリは,再構築待ちのエントリ ID 等を保持しますので,ウェブサーバの実行権限で書き込める必要があります.また,このディレクトリには,以下のファイル等を含めることはできません *7

  • .LOCK
  • .WAIT
  • 「.」で始らず,数字を含むファイル等

次に,lib/MT/App/Trackback.pm を修正します.

$app->rebuild_indexes( Blog => $blog )
  or return $app->_response(Error =>
    $app->translate("Rebuild failed: [_1]", $app->errstr));

上記の部分をコメントアウトしてください.

次に,同じ関数の最後にある return 文の前に以下を追加してください.

if ($entry) {
  rebuildBackground($entry);
} else {
  $app->rebuild_indexes( Blog => $blog )
    or return $app->_response(Error =>
      $app->translate("Rebuild failed: [_1]", $app->errstr));
}

以上で導入完了です.何度か TrackBack を送信して正しく動作することを確認しておいてください.

tb-rebuild.pl の処理概要

以下,興味がある人だけ読んでください.

通常は再構築を行う場所で子プロセス,孫プロセスを生成します.子プロセスはすぐに終了するので,Movable Type はすぐに次の処理に移ることができます.

孫プロセスでは,まず $TMP ディレクトリに再構築対象を書き込みます.そして,再構築中のプロセスがあるかどうかを調べます.なければ再構築を開始しますが,そうでない場合は,今度は待機中のプロセスがあるかどうかを調べます.待機中のプロセスがなければ,先の再構築プロセスが終了するまで待機します.もしすでに待機プロセスがあれば即座に終了します.再構築するはずだったエントリは,既に待機しているプロセスが再構築することになります.

再構築プロセスは TrackBack を受信したプロセスから独立して動作するため,この様な処理を行わない場合は,ウェブサーバが許容している同時アクセス数を超える再構築プロセスが存在する可能性がでてきます.しかし,上記処理によって大量の TrackBack を受信したときのシステム負荷を抑えているわけです.そしてそれは,tb-rebuild.pl を導入する前よりも負荷は低いはずです.

ちなみに,tb-rebuild.pl は本来プラグイン的な性質を持つものではないのですが,都合よく再構築前にロードされるので,plugins ディレクトリに放り込むようにしています.

おわりに

「my $app = new MT::App;」なんてことをしていますが,悪影響がないかをチェックしていません.多分大丈夫だとは思うのですが.ただ,これをしないとうまく動かないのです.DB とのコネクションの問題だと思います.識者の方のご意見をお待ちしています.

最近の更新履歴

  • 2004-02-03 再構築開始後に Entry オブジェクト壊れてしまうようなので,他の処理が終わってから再構築するように上記ドキュメントを変更.(アドオン本体の修正は無し)
  • 2004-01-26 全面的に書き換え.
  • 2004-01-24 公開

*1 *2: エントリ毎のページ等
*3: 一見,動作するように見えることがあるかもしれませんが,アクセス過多時にシステムが不安定になる可能性があります.
*4: 多数の TrackBack が集中した場合,それらをまとめて処理するので,処理時間が長くなります.
*5: 一応,エラーが発生したときにはサーバのエラーログには残るようにはしていますが.
*6: tb-rebuild.pl の中にある変数$TMP で指定していますので必要に応じて変更してください.
*7: これらのファイルがある場合は,tb-rebuild.pl が上書きしたり消したりします.

トラックバック(0)

トラックバックURL: http://d.nym.jp/mt/trackback/1701

コメントする

最近のコメント

アーカイブ

Author

nym <n...@nym.jp>
Powered by Movable Type 5.161-ja