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 をよみこまなくていい
Published: 2010-03-22(Mon) 09:40