q4 mでメッセージキュー
TRANSCRIPT
Q4MQ4M でメッセージキでメッセージキューュー
Q4MQ4M とはとは
MySQL5.1MySQL5.1 のプラガブルストレージエンのプラガブルストレージエンジンとして動作するメッセージキュージンとして動作するメッセージキュー
サイボウズ・ラボの奥一穂さんが開発サイボウズ・ラボの奥一穂さんが開発 ストレージエンジンとして利用できる為、ストレージエンジンとして利用できる為、簡単簡単
SQLSQL 文で操作できるのでシンプル文で操作できるのでシンプル
メッセージキューとは?メッセージキューとは? メッセージを一時的に貯めておき、順次メッセージを一時的に貯めておき、順次処理するための仕組み処理するための仕組み
迅速なレスポンスが必要なアプリケーシ迅速なレスポンスが必要なアプリケーションにおいて、時間のかかる処理を非同ョンにおいて、時間のかかる処理を非同期に行うために、バックグラウンドで順期に行うために、バックグラウンドで順次処理していくような場合に利用次処理していくような場合に利用
キューってなんだっけ?キューってなんだっけ? いわゆる待ち行列で、コンピュータの基本的ないわゆる待ち行列で、コンピュータの基本的な
データ構造の一つデータ構造の一つ データを先入れ先出し(データを先入れ先出し( FIFOFIFO :: First In First OuFirst In First Ou
tt )のリスト構造で保持するもの)のリスト構造で保持するもの キューからデータを取り出すときは、先に入れキューからデータを取り出すときは、先に入れ
たデータから順に取り出される。たデータから順に取り出される。 キューにデータを入れることをエンキュー(キューにデータを入れることをエンキュー( enen
queuequeue )、取り出すことをデキュー()、取り出すことをデキュー( dequeudequeuee )という)という
キューとは逆に後入れ先出し(キューとは逆に後入れ先出し( LIFOLIFO )の構造を)の構造をスタックと呼ぶスタックと呼ぶ
キューの構造キューの構造
A
B
A
C
B
A
1
23
A B
C
C
B
C
4 5 6
enqueue
dequeue
スタックの構造スタックの構造
A
B
A
C
B
A
1
2
3
AB
A
B
A
C4 5 6
push
pop
早速早速 Q4MQ4M を使ってみようを使ってみよう
インストールインストール公式ページ( http://q4m.31tools.com)からソースをダウンロードして展開します。
# ./configure \
–with-mysql={ コンパイル済みの mysql のソースディレクトリ } \
–prefix={mysql ディレクトリ }
# make
# make install
# mysql –u root –p < support-files/install.sql
確認する確認するmysql> show plugins;+------------+----------+----------------+--------------------+---------+| Name | Status | Type | Library | License |+------------+----------+----------------+--------------------+---------+| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL || partition | ACTIVE | STORAGE ENGINE | NULL | GPL || ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL || BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL || CSV | ACTIVE | STORAGE ENGINE | NULL | GPL || FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL || MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL || InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL || MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL || MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL || ndbcluster | DISABLED | STORAGE ENGINE | NULL | GPL || QUEUE | ACTIVE | STORAGE ENGINE | libqueue_engine.so | GPL |+------------+----------+----------------+--------------------+---------+12 rows in set (0.00 sec)
show plugins; コマンドで確認します。 show engines; でも確認できます。
動かしてみる動かしてみる
mysql> CREATE TABLE queue_test( -> id INT NOT NULL, -> message VARCHAR(255) NOT NULL -> )ENGINE=QUEUE;Query OK, 0 rows affected (0.05 sec)
テーブルを作成します。ストレージエンジンに queueを指定します。
これで Q4M 用のテーブルの完成です。
enqueue してみましょうmysql> INSERT INTO queue_test(id,message)VALUES(1,'message1'),(2,'message2'),(3,'message3');Query OK, 3 rows affected (0.03 sec)Records: 3 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM queue_test;+----+----------+| id | message |+----+----------+| 1 | message1 |+----+----------+1 row in set (0.01 sec)
queue を取り出しているこの状態をオーナーモードと呼び、この状態でqueue テーブルをセレクトすると、 dequeue したレコードのみが取得できます。
mysql> SELECT queue_wait('queue_test');+--------------------------+| queue_wait('queue_test') |+--------------------------+| 1 |+--------------------------+1 row in set (0.00 sec)
dequeue してみます。dequeue するには、 queue_wait という function を使用します。dequeue に成功すると、1という結果が返ってきます。
mysql> SELECT queue_end();+-------------+| queue_end() |+-------------+| 1 |+-------------+1 row in set (0.02 sec)
dequeue して取り出した値を使った処理が完了した場合、 queue_endという function を呼ぶと、取り出した queue を削除しオーナーモードが解除されます。
処理中にエラーが発生した場合等は、 queue_abort という function を呼ぶと取り出した queue を戻すことができます。
オーナーモードについてオーナーモードについてQ4M では、 queue_wait を呼ぶとオーナーモードという状態になります。
オーナーモード中、そのコネクション内では queue_wait をコールした際に dequeue 対象の1行のレコードのみを取得できるようになります。
このとき、別のコネクションでは、他のコネクションでオーナーモードで取得している行以外が取得できます。
こんなこともできるこんなこともできる
条件をつけて条件をつけて dequeuedequeue
mysql> SELECT queue_wait('queue_test:id>2');+-------------------------------+| queue_wait('queue_test:id>2') |+-------------------------------+| 1 |+-------------------------------+1 row in set (0.00 sec)
dequeue 時に条件をつけてキューを取得することができます。
テーブル名の指定のあとにコロンで条件を指定します。
複数条件や、複雑な条件は指定できないようです。
タイムアウト値を設定してタイムアウト値を設定して deqdequeueueue
dequeue 時にタイムアウト値を設定してキューを取得することができます。mysql> SELECT queue_wait('queue_test',10);+-----------------------------+| queue_wait('queue_test',10) |+-----------------------------+| 0 |+-----------------------------+1 row in set (10.00 sec)
queueテーブルが空の場合、最大10秒待ってから結果を返してくれます。mysql> SELECT queue_wait('queue_test',10);+-----------------------------+| queue_wait('queue_test',10) |+-----------------------------+| 1 |+-----------------------------+1 row in set (2.22 sec)
wait中にレコードがインサートされるとその時点で結果を返します。
優先度で優先度で dequeuedequeue
mysql> CREATE TABLE `queue_test2` ( -> `id` int(11) NOT NULL, -> `message` varchar(255) NOT NULL -> ) ENGINE=QUEUE ;Query OK, 0 rows affected (0.06 sec)
複数のキューテーブルを用意して優先度順にキューを取り出すことができます。
優先度が低いキュー用のテーブルを作成します。
mysql> SELECT queue_wait('queue_test','queue_test2',10);+-------------------------------------------+| queue_wait('queue_test','queue_test2',10) |+-------------------------------------------+| 1 |+-------------------------------------------+1 row in set (0.00 sec)
優先して取得したいキューテーブルから順に queue_wait の引数に記述します。
結果として、取得可能なテーブルの番号が返ってきます。
ここでは、優先度が高い queue_test テーブルにレコードがあったため、1が返っています。
queue_test にレコードがなく、 queue_test2 にレコードがある場合は、結果として2が返ります。
Q4MQ4M を使う上でやってはいけなを使う上でやってはいけないこといこと
複数行に対して1つの複数行に対して1つの DELETEDELETE 文による文による削除を行う削除を行う テーブルが壊れるテーブルが壊れる
queue_waitqueue_wait 中のレコードがある状態で中のレコードがある状態で trutruncatencate を行うを行う テーブルが壊れるテーブルが壊れる
オーナーモード中は、オーナーモード中は、 queue_waitqueue_wait しないしない レコードが消えてしまうレコードが消えてしまう