tokuhirom's Blog

Qudo をためしてみた

Qudo についてる SQL をつっこむ。

% sqlite3 /tmp/qudo.db < doc/schema-sqlite.sql

ワーカースクリプトをかいてみる。

use strict;
use warnings;
use Qudo;

{
    package MyApp::Worker::Foo;
    use parent 'Qudo::Worker';
http://d.hatena.ne.jp/tokuhirom/
    sub work {
        my ($class, $job) = @_;
        print $job->arg;
        $job->completed;
    }
}

my $qudo = Qudo->new(
    driver_class => 'Skinny',
    databases    => [
        {
            dsn      => 'dbi:SQLite:/tmp/qudo.db',
            username => '',
            password => ''
        }
    ],
    manager_abilities => [qw/MyApp::Worker::Foo/],
);
$qudo->work(); # work forever

クライアントスクリプトはこんなかんじ。

use strict;
use warnings;
use Qudo;

{
    package MyApp::Worker::Foo;
    use parent 'Qudo::Worker';

    sub work {
        my ($class, $job) = @_;
        print $job->arg;
        $job->completed;
    }
}

my $qudo = Qudo->new(
    driver_class => 'Skinny',
    databases    => [
        {
            dsn      => 'dbi:SQLite:/tmp/qudo.db',
            username => '',
            password => ''
        }
    ],
);
$qudo->enqueue('MyApp::Worker::Foo', {arg => "ARG" });

発行されるSQL

SQLite の場合。

クライアント側
SELECT id, name FROM func WHERE (name = ?) LIMIT 1 :binds MyApp::Worker::Foo
INSERT INTO job (`priority`, `enqueue_time`, `arg`, `retry_cnt`, `grabbed_until`, `run_after`, `uniqkey`, `func_id`) VALUES (?, ?, ?, ?, ?, ?, ?, ?) :binds 0, 1269250274, ARG, 0, 0, 1269250274, undef, 1
SELECT job.id, job.arg, job.uniqkey, job.func_id, job.grabbed_until, job.retry_cnt, job.priority, func.name AS funcname FROM job INNER JOIN func ON job.func_id = func.id WHERE (job.id = ?) ORDER BY job.priority DESC LIMIT 1 :binds 11
ワーカー側
SELECT job.id, job.arg, job.uniqkey, job.func_id, job.grabbed_until, job.retry_cnt, job.priority, func.name AS funcname FROM job INNER JOIN func ON job.func_id = func.id WHERE (func.name IN (?)) AND (job.grabbed_until <= ?) AND (job.run_after <= ?) ORDER BY job.priority DESC LIMIT 30 :binds MyApp::Worker::Foo, 1269250521, 1269250521
SELECT job.id, job.arg, job.uniqkey, job.func_id, job.grabbed_until, job.retry_cnt, job.priority, func.name AS funcname FROM job INNER JOIN func ON job.func_id = func.id WHERE (func.name IN (?)) AND (job.grabbed_until <= ?) AND (job.run_after <= ?) ORDER BY job.priority DESC LIMIT 30 :binds MyApp::Worker::Foo, 1269250526, 1269250526
UPDATE job SET `enqueue_time` = ?, `run_after` = ?, `grabbed_until` = ? WHERE (grabbed_until = ?) AND (id = ?) :binds 1269250526, 1269250526, 1269254126, 0, 12
DELETE FROM job WHERE (id = ?) :binds 12
SELECT job.id, job.arg, job.uniqkey, job.func_id, job.grabbed_until, job.retry_cnt, job.priority, func.name AS funcname FROM job INNER JOIN func ON job.func_id = func.id WHERE (func.name IN (?)) AND (job.grabbed_until <= ?) AND (job.run_after <= ?) ORDER BY job.priority DESC LIMIT 30 :binds MyApp::Worker::Foo, 1269250531, 1269250531

よくない点

ドキュメント

とにかくドキュメントが貧弱。日本語のドキュメントが多少あるけど、これもまたmarkupがすくなくて微妙によみづらい。

ワーカークラスをよみこまないと、クライアントが動作しないっぽい?
Can't locate object method "hooks" via package "MyApp::Worker::Foo" (perhaps you forgot to load "MyApp::Worker::Foo"?) at /usr/local/app/perl-5.10.1/lib/site_perl/5.10.1/Qudo/Manager.pm line 64.

ワーカークラスをよみこまないといけないというのは、メモリ節約のためにワーカーを分離したいというような要求にたえられない。

ワーカークラスの登録を ->new 以外でやる方法がわからない

Amon や Ark のようなコンテナによるインスタンス作成をおこなう場合、new でマネージャーを構築させるというのは非常に不自然。

よい点

  • TheSchwartz よりテストがとおってる。
  • Data::ObjectDriver をよみこまなくていい