Q4M―MySQLを利用したジョブキュー
今まではPerlで作られたミドルウェアとしてのジョブキューを紹介してきましたが,
Q4Mの使い方
Q4Mのインストール方法はドキュメントで確認してください。
Q4Mをインストールしたら次はジョブキューで使用するテーブルを定義します。TheSchwartzやQudoでは決められたテーブル定義を使用する必要がありましたが,
CREATE TABLE welcome (
nickname varchar(255) NOT NULL,
email varchar(255) NOT NULL,
created_on int(10) unsigned NOT NULL
) ENGINE=QUEUE DEFAULT CHARSET=utf8;
通常のテーブル定義と異なるのはENGINEにQUEUEを使っている点です。Q4MをMySQLにインストールするとQUEUEエンジンが利用できるようになり,
ジョブの登録
TheSchwartzやQudoではジョブの情報をシリアライズしてデータベースのカラムに格納していましたが,
mysql> INSERT INTO welcome(nickname,email,created_on)
VALUES('nekokak','nekokak@gmail.com',UNIX_TIMESTAMP());
登録したジョブは,
mysql> SELECT * FROM welcome;
+----------+-------------------+------------+
| nickname | email | created_on |
+----------+-------------------+------------+
| nekokak | nekokak@gmail.com | 1307539020 |
+----------+-------------------+------------+
実際のアプリケーションではDBIを使ってwelcomeテーブルにINSERTを実行します。
#! /usr/bin/perl
use strict;
use warnings;
use DBI;
my $dbh = DBI->connect('dbi:mysql:q4m_test','root','');
$dbh->do(q{
INSERT INTO welcome(nickname,email,created_on)
VALUES(?,?,UNIX_TIMESTAMP())
}, undef, 'nekokak', 'nekokak@gmail.com');
ジョブの取り出し
次にジョブを取得します。ジョブを取得するにはqueue_
mysql> SELECT queue_wait('welcome');
+-----------------------+
| queue_wait('welcome') |
+-----------------------+
| 1 |
+-----------------------+
成功すると結果として1が返ってきます。この状態をオーナーモードと呼びます。オーナーモード中に対象テーブルをSELECTすると1レコードだけ取得できるようになります。
mysql> SELECT * FROM welcome;
+----------+-------------------+------------+
| nickname | email | created_on |
+----------+-------------------+------------+
| nekokak | nekokak@gmail.com | 1307539020 |
+----------+-------------------+------------+
ジョブの終了
ジョブワーカはこれで取得できた情報をもとに処理を実行します。ジョブワーカの処理が正常に終了したらキューを終了させるコマンドを実行します。
mysql> SELECT queue_end();
+-------------+
| queue_end() |
+-------------+
| 1 |
+-------------+
これにより同時にジョブレコードが削除され,
mysql> SELECT queue_abort();
+---------------+
| queue_abort() |
+---------------+
| 1 |
+---------------+
を実行することでオーナーモードを解除します。queue_
Q4Mを使った簡単なサンプルプログラムは次のようになります。
#! /usr/bin/perl
use strict;
use warnings;
use DBI;
my $dbh = DBI->connect('dbi:mysql:q4m_test','root','');
while (1) {
my $lock = $dbh->do("SELECT queue_wait('welcome')")
if ($lock) {
my $queue = $dbh->do('SELECT * FROM welcome');
# ここでジョブの処理をさせる
$dbh->do('SELECT queue_end()');
}
}
ジョブのロック時間の調整
queue_
mysql> select queue_wait('welcome',10);
+--------------------------+
| queue_wait('welcome',10) |
+--------------------------+
| 0 |
+--------------------------+
指定秒数内にキューからデータを取得できない場合は,