Qudo―もう一つのTheSchwartz
TheSchwartzは実績豊富なプログラムですが、
QudoはTheSchwartzにはないフックポイントとプラグイン機構を提供しています。フック機能を使えば、
TheSchwartzではシリアライザはStorable以外は利用できませんでしたが、
また、
ほかにもフックポイントを利用すると、
Qudoの使い方
QudoもTheSchwartzと同様にcpanmなどでインストールしてください。Qudoを使うにはTheSchwartzと同様にバックエンドにRDBMSを利用し、
データベースのセットアップには同梱されているqudoコマンドを利用します。次のように実行すると、
$ qudo --db qudo_test --user root\
--pass password -f-rdbms mysql
なお--dry_
Qudoを使ってアプリケーションからジョブを登録するには次のようにします。
#! /usr/bin/perl
use strict;
use warnings;
use Qudo;
my $qudo = Qudo->new(
databases => [+{
dsn => 'dbi:mysql:qudo_test',
username => 'root',
password => '',
}],
);
$qudo->enqueue("MyWorker", {
arg => 'arg',
uniqkey => 'uniqkey'
});
登録したジョブを処理するワーカは次のようになります。
package MyWorker;
use strict;
use warnings;
use parent 'Qudo::Worker';
sub work {
my ($self , $job ) = @_;
my $job_arg = $job->arg();
# ここでワーカにジョブを処理させる
$job->completed(); # or $job->abort
}
1;
作成したワーカを使って実際にジョブを処理させるには次のようにします。
#! /usr/bin/perl
use strict;
use warnings;
use Qudo;
my $qudo = Qudo->new(
databases => [+{
dsn => 'dbi:mysql:qudo_test',
username => '',
password => '',
}],
manager_abilities => [qw/MyWorker/],
);
$qudo->work();
基本的な使い方はTheSchwartz と同じなので、
QudoではデフォルトでDBIx::Skinnyという筆者が作成したO/
Qudo::Driver::DBI を利用するには次のようにdriver_
#! /usr/bin/perl
use strict;
use warnings;
use Qudo;
my $qudo = Qudo->new(
driver_class => 'DBI',
databases => [+{
dsn => 'dbi:mysql:qudo_test',
username => '',
password => '',
}],
);
QudoではDriverクラスを任意のクラスに差し替えることが可能なので、
Qudo::Workerの設定
Qudoでは複数のプロセスが同一のジョブを処理しないようにジョブのロックを行います。Qudoのジョブロックの方法は単純で、
UPDATEのかけ方としては、
こうしてロックが取得できたワーカはジョブを処理し、
しかし、
package MyWorker;
use strict;
use warnings;
use parent 'Qudo::Worker';
sub grab_for { 30 } # grab_for 30 sec
sub work {
my ($self , $job ) = @_;
...
}
1;
エラーが発生した場合はデータベースにジョブが残ってしまうので、
ジョブのリトライ
ワーカクラスで処理中にエラーが発生しても、
package MyWorker;
use strict;
use warnings;
use parent 'Qudo::Worker';
sub max_retries { 1 }
sub work {
my ($self , $job ) = @_;
...
}
1;
リトライは、
package MyWorker;
use strict;
use warnings;
use parent 'Qudo::Worker';
sub max_retries { 1 }
sub retry_delay { 60 } # wait 60 sec
sub work {
my ($self , $job ) = @_;
...
}
1;
エラーの確認方法
ワーカで設定したリトライ回数以上のエラーが発生した場合、
エラーが発生したときのオペレーションとしては、
#! /usr/bin/perl
use strict;
use warnings;
use Qudo;
my $qudo = Qudo->new(
databases => [+{
dsn => 'dbi:mysql:qudo_test',
username => '',
password => '',
}],
);
my $exceptions = $qudo->exception_list;
my ($db, $exception) = each %$exceptions;
$manager->enqueue_from_failed_job(
$exceptions->[0], $db
);