tokuhirom's Blog

Jonk をいろいろかえてもらったの件

https://github.com/nekokak/p5-Jonk

ぱっとみで気になったところをいくつか指摘してなおしてもらいました。コードは10文字ぐらいしかかいていない。

だいぶシンプルなので、TheSchwartz や Qudo よりはこっちのほうがすきかな、とおもいます。結局この手のライブラリって、こまかい要件がアプリケーションによって千差万別であるから、こういう minimalistic なコアをつかって、あとの部分は

現状、mysql と sqlite3 をサポートしていて、postgresql については、まだ対応してないみたいです。mysql だとこんなかんじのスキーマをつかいます(table 名は customizable)

    CREATE TABLE job (
        id           int(10) unsigned NOT NULL auto_increment,
        func         varchar(255)     NOT NULL,
        arg          MEDIUMBLOB,
        enqueue_time DATETIME         NOT NULL,
        primary key ( id )
    ) ENGINE=InnoDB

エンキュー側はこんなかんじ。

    use DBI; 
    my $dbh = DBI->connect(...);
        use Jonk::Client;
        my $jonk = Jonk::Client->new($dbh);
        $jonk->enqueue('MyWorker', 'arg');

ワーカー側はこんなかんじ。

    use strict;
    use warnings;
    use Parallel::Prefork;
    use DBI;
    use Jonk::Worker;
    use Your::Worker;

    my $pm = Parallel::Prefork->new({
        max_workers       => 10,
        trap_signals      => {
            TERM => 'TERM',
            HUP  => 'TERM',
        },
    });

    while ($pm->signal_received ne 'TERM') {
        $pm->start and next;

        my $dbh = DBI->connect('dbi:mysql:test','user','pass');
        my $jonk = Jonk::Worker->new($dbh => {functions => [qw/worker_key/]});

        while (1) {
            if (my $job = $jonk->dequeue) {
                Your::Worker->work($job);
            } else {
                sleep(3); # wait for 3 sec.
            }
        }

        $pm->finish;
    }

    $pm->wait_all_children();

特徴しては、TheSchwartz や Qudo とおなじく、以下のようなところかなーとかんじました。

TheSchwartz は Data::ObjectDriver に依存していたり、Qudo も Skinny に依存してるしなんかゴテゴテしているしといったところがあったわけですが、Jonk は Minimalistic で非常によみやすいのでよいのではないのかとおもいます(基本的に発行してるクエリはどれもおなじようなものらしいです)。