Perl Hackers Hub

第10回 ジョブキューで後回し大作戦―TheSchwartz,Qudo,Q4M(2)

この記事を読むのに必要な時間:およそ 3 分

Qudo―もう一つのTheSchwartz

TheSchwartzは実績豊富なプログラムですが,拡張性に欠けるところがあります。そこで筆者は拡張性に重点を置いたジョブキューのしくみを作成しました。それがQudo(クドー)です。

QudoはTheSchwartzにはないフックポイントとプラグイン機構を提供しています。フック機能を使えば,ジョブデータをデータベースに登録する際に使用するシリアライザなどを自由に選択できます。

TheSchwartzではシリアライザはStorable以外は利用できませんでしたが,QudoではJSONJavaScript Object NotationやData::MessagePackを使ってジョブデータをシリアライズできます。Storableでシリアライズされたデータはデータベースの中身を直接覗いても読めませんが,JSONでシリアライズすればデータベースを直接見たときに読める状態でジョブが登録されます。

また,Storableは利用するPerlのバージョンによって互換性がないことがあります。筆者はStorableのバージョン2.15でシリアライズしたデータが2.13でデシリアライズできない問題に遭遇したこともあります。StorableはPerlのコアモジュールとして提供されているためバージョンの調整が難しくなります。StorableはData::MessagePackなどのシリアライズモジュールと比較すると低速でデータの圧縮率も悪いので,可能であればStorable以外のシリアライズモジュールを利用するとよいでしょう。

ほかにもフックポイントを利用すると,ジョブの処理が一定回数以上失敗したらアラートメールを送信したりすることもできます。このようにQudoはTheSchwartzではちょっと手の届かない部分を自由に拡張できます。

Qudoの使い方

QudoもTheSchwartzと同様にcpanmなどでインストールしてください。Qudoを使うにはTheSchwartzと同様にバックエンドにRDBMSを利用し,MySQL,SQLite,PostgreSQLに対応しています。

データベースのセットアップには同梱されているqudoコマンドを利用します。次のように実行すると,Qudoで利用するスキーマを手元のデータベースにセットアップできます。

$ qudo --db qudo_test --user root\
   --pass password -f-rdbms mysql

なお--dry_runオプションを付けて実行すると,実際にデータベースにスキーマをセットアップせず画面にスキーマ情報を表示できるので,リモートのデータベースに対してセットアップしたい場合は--dry_runオプション付きで表示された情報を使ってセットアップしてください。

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 と同じなので,TheSchwartzを使ったことがある人はそれほど迷わず利用できます。

QudoではデフォルトでDBIx::Skinnyという筆者が作成したO/Rマッパをバックエンドで利用しているため,DBIで直接SQLを実行するよりもパフォーマンスが悪くなることがあります。そのようなときは星野将氏が作成したQudo::Driver::DBIをインストールし利用すれば,それだけでパフォーマンスを改善できます。

Qudo::Driver::DBI を利用するには次のようにdriver_classを指定するだけです。

#! /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クラスを任意のクラスに差し替えることが可能なので,よりパフォーマンスに特化させたDriverクラスを作成し利用することもできます。

著者プロフィール

小林篤(こばやしあつし)

株式会社ディー・エヌ・エー プラットフォームシステムグループに所属。Mobagae APIやGadget Serverを担当。

「YAPC::Asia」や「Yokohama.pm」などでスピーカーをするなど,Perl関連のコミュニティへ積極的に参加している。YAPC::Asia2010ではベストスピーカ賞(次点)受賞。

CPANモジュールに「DBIx::Skinny」「Teng」「Qudo」など多数。

ネコが大好きだが,パグを2頭かってるプログラマ。

Twitter:@nekokak

Blog:http://blog.nekokak.org/

コメント

コメントの記入