クローラ作る日記 #2

created: 2017/08/01 02:32 updated: 2017/08/01 02:32

前回より、URLのキューをRedisだけで構成するのは無理があったので、代替できそうなミドルウェアやらなんやらを検討したんだけども、リソースが豊富なわけでもないので結局PostgreSQLの一テーブルをキューとして扱うことに。
PostgreSQL 9.5からはSKIP LOCKEDという機能が用意されていて、それを使えば下記のようなクエリでキューっぽいあれを実現できる。まぁ一旦これで。

DELETE FROM url_queue WHERE id = (SELECT id FROM url_queue ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED) RETURNING url;

最近は「何十スレッドも立ち上げている割にはクロールの速度が遅い」という問題があって(10~20ページ/秒くらい)、とりあえずWebページの取得等、処理の主要な部分が消費している時間を計測してログに出力するためのコードをちょこちょこ書いている。

で、その出力を見るとどうやらWebページの取得(http関連の通信)で消費できている時間は全体の1/4程度で、それ以外の時間はアクセス可能なURL(サーバー)を取り出して関連するデータに対するロックを獲得するためだけに浪費されているっぽい。
完全に作りの問題なので、次はこの辺をなんとかするかという感じ。