malaさんのYAPC::Asia 2009の資料
http://ma.la/files/yapcasia2009/#0
perlのライブラリはよくわかんないけど、非同期処理は勉強になりました。
旧来のクローラの仕組み
ただ並列処理するだけだと遅いよという話。
1プロセスで全て行う(フィードの取得、解析、DB書き込み) 並列実行数だけプロセスを立ち上げる(Parallel::ForkManager) 指定件数のフィードを処理したら終了
「のろまな」クライアント
Fetch->Parse->Updateという処理があったとしたら単純に並列かするだけだとFetchしている間はParse->Updateは待ちになるから遅い。
改善
まずは処理を分割。
- Fetchする処理と、その後の(重い)処理は別プロセスに分けよう
- HTTPを非同期化/並列化するライブラリを使うだけでは速度は向上しない
タスクはキューを使いましょう。
HTTPリクエストを非同期化する前にタスクを分割せよ
メッセージキュー(あるいはジョブサーバー)を使うことでタスクを分割できる
クローラの例だとこんな感じに分割
Fetch/Parse/Update の3つのモジュールに分割
- Fetch: フィードの取得、更新されているかのチェック
- Parse: フィードの解析
- Update: DBへの書き込みを行う
この考えはgoogle appengine のTaskQueueで使えそうだ。