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 とおなじく、以下のようなところかなーとかんじました。
- Q4M をセットアップするのがめんどくさい
- Q4M よりも問題がおこったときに追いやすい
- Q4M よりも挙動がわかりやすい
- そんなに速度が必要ない
- 1sec 程度の delay がジョブの開始までの間に発生しても問題がない
TheSchwartz は Data::ObjectDriver に依存していたり、Qudo も Skinny に依存してるしなんかゴテゴテしているしといったところがあったわけですが、Jonk は Minimalistic で非常によみやすいのでよいのではないのかとおもいます(基本的に発行してるクエリはどれもおなじようなものらしいです)。