TheSchwartz のような RDBMS をつかった job queue は、新規に daemon をたてたりする必要がないので楽でいいのですが、一方で job の追加の timing が storage から push でおくられてこないので、若干の delay が生じてしまうのが難点でした。
この問題を解決するために、mysql の binlog API を用いて、処理してみるハックを考えてみました。
binlog API を利用すると更新クエリを streaming で処理できるので、こういったハックも簡単にできちゃいます。おもしろい。
use 5.016000;
use MySQL::BinLog;
use TheSchwartz;
my $sch = TheSchwartz->new(...) or die;
$sch->can_do($_) for ...;
$sch->work_until_done();
my $binlog = MySQL::BinLog->new(MySQL::BinLog::create_transport(...));
$binlog->connect();
$sch->work_until_done(); # and once more.
while (my $event = $binlog->wait_for_next_event()) {
my $type = $event->get_event_type();
if ($type eq QUERY_EVENT) {
if ($event->query =~ /INSERT\s*INTO\s*job/i) {
say("WORK!!!!!");
$sch->work_until_done(); # ← ここでたまってるジョブを一気にやっつける
}
}
}