q4 mでメッセージキュー

18
Q4M Q4M ででででででででで ででででででででで

Upload: ngi-group

Post on 27-May-2015

2.913 views

Category:

Documents


8 download

TRANSCRIPT

Page 1: Q4 Mでメッセージキュー

Q4MQ4M でメッセージキでメッセージキューュー

Page 2: Q4 Mでメッセージキュー

Q4MQ4M とはとは

MySQL5.1MySQL5.1 のプラガブルストレージエンのプラガブルストレージエンジンとして動作するメッセージキュージンとして動作するメッセージキュー

サイボウズ・ラボの奥一穂さんが開発サイボウズ・ラボの奥一穂さんが開発 ストレージエンジンとして利用できる為、ストレージエンジンとして利用できる為、簡単簡単

SQLSQL 文で操作できるのでシンプル文で操作できるのでシンプル

Page 3: Q4 Mでメッセージキュー

メッセージキューとは?メッセージキューとは? メッセージを一時的に貯めておき、順次メッセージを一時的に貯めておき、順次処理するための仕組み処理するための仕組み

迅速なレスポンスが必要なアプリケーシ迅速なレスポンスが必要なアプリケーションにおいて、時間のかかる処理を非同ョンにおいて、時間のかかる処理を非同期に行うために、バックグラウンドで順期に行うために、バックグラウンドで順次処理していくような場合に利用次処理していくような場合に利用

Page 4: Q4 Mでメッセージキュー

キューってなんだっけ?キューってなんだっけ? いわゆる待ち行列で、コンピュータの基本的ないわゆる待ち行列で、コンピュータの基本的な

データ構造の一つデータ構造の一つ データを先入れ先出し(データを先入れ先出し( FIFOFIFO :: First In First OuFirst In First Ou

tt )のリスト構造で保持するもの)のリスト構造で保持するもの キューからデータを取り出すときは、先に入れキューからデータを取り出すときは、先に入れ

たデータから順に取り出される。たデータから順に取り出される。 キューにデータを入れることをエンキュー(キューにデータを入れることをエンキュー( enen

queuequeue )、取り出すことをデキュー()、取り出すことをデキュー( dequeudequeuee )という)という

キューとは逆に後入れ先出し(キューとは逆に後入れ先出し( LIFOLIFO )の構造を)の構造をスタックと呼ぶスタックと呼ぶ

Page 5: Q4 Mでメッセージキュー

キューの構造キューの構造

A

B

A

C

B

A

23

A B

C

C

B

C

4 5 6

enqueue

dequeue

Page 6: Q4 Mでメッセージキュー

スタックの構造スタックの構造

A

B

A

C

B

A

AB

A

B

A

C4 5 6

push

pop

Page 7: Q4 Mでメッセージキュー

早速早速 Q4MQ4M を使ってみようを使ってみよう

Page 8: Q4 Mでメッセージキュー

インストールインストール公式ページ( http://q4m.31tools.com)からソースをダウンロードして展開します。

# ./configure \

–with-mysql={ コンパイル済みの mysql のソースディレクトリ } \

–prefix={mysql ディレクトリ }

# make

# make install

# mysql –u root –p < support-files/install.sql

Page 9: Q4 Mでメッセージキュー

確認する確認する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; でも確認できます。

Page 10: Q4 Mでメッセージキュー

動かしてみる動かしてみる

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

Page 11: Q4 Mでメッセージキュー

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という結果が返ってきます。

Page 12: Q4 Mでメッセージキュー

mysql> SELECT queue_end();+-------------+| queue_end() |+-------------+| 1 |+-------------+1 row in set (0.02 sec)

dequeue して取り出した値を使った処理が完了した場合、 queue_endという function を呼ぶと、取り出した queue を削除しオーナーモードが解除されます。

処理中にエラーが発生した場合等は、 queue_abort という function を呼ぶと取り出した queue を戻すことができます。

Page 13: Q4 Mでメッセージキュー

オーナーモードについてオーナーモードについてQ4M では、 queue_wait を呼ぶとオーナーモードという状態になります。

オーナーモード中、そのコネクション内では queue_wait をコールした際に dequeue 対象の1行のレコードのみを取得できるようになります。

このとき、別のコネクションでは、他のコネクションでオーナーモードで取得している行以外が取得できます。

Page 14: Q4 Mでメッセージキュー

こんなこともできるこんなこともできる

Page 15: Q4 Mでメッセージキュー

条件をつけて条件をつけて dequeuedequeue

mysql> SELECT queue_wait('queue_test:id>2');+-------------------------------+| queue_wait('queue_test:id>2') |+-------------------------------+| 1 |+-------------------------------+1 row in set (0.00 sec)

dequeue 時に条件をつけてキューを取得することができます。

テーブル名の指定のあとにコロンで条件を指定します。

複数条件や、複雑な条件は指定できないようです。

Page 16: Q4 Mでメッセージキュー

タイムアウト値を設定してタイムアウト値を設定して 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中にレコードがインサートされるとその時点で結果を返します。

Page 17: Q4 Mでメッセージキュー

優先度で優先度で 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が返ります。

Page 18: Q4 Mでメッセージキュー

Q4MQ4M を使う上でやってはいけなを使う上でやってはいけないこといこと

複数行に対して1つの複数行に対して1つの DELETEDELETE 文による文による削除を行う削除を行う テーブルが壊れるテーブルが壊れる

queue_waitqueue_wait 中のレコードがある状態で中のレコードがある状態で trutruncatencate を行うを行う テーブルが壊れるテーブルが壊れる

オーナーモード中は、オーナーモード中は、 queue_waitqueue_wait しないしない レコードが消えてしまうレコードが消えてしまう