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