tokuhirom's Blog

TheSchwartz のような RDBMS をつかったジョブキューをリアルタイムに処理するアイディア

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(); # ←  ここでたまってるジョブを一気にやっつける
        }
    }
}