読者です 読者をやめる 読者になる 読者になる

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で使えそうだ。