Q4 Mでメッセージキュー

3,253 views
3,100 views

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,253
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
14
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Q4 Mでメッセージキュー

  1. 1. Q4M でメッセージキュー
  2. 2. Q4Mとは <ul><li>MySQL5.1のプラガブルストレージエンジンとして動作するメッセージキュー </li></ul><ul><li>サイボウズ・ラボの奥一穂さんが開発 </li></ul><ul><li>ストレージエンジンとして利用できる為、簡単 </li></ul><ul><li>SQL文で操作できるのでシンプル </li></ul>
  3. 3. メッセージキューとは? <ul><li>メッセージを一時的に貯めておき、順次処理するための仕組み </li></ul><ul><li>迅速なレスポンスが必要なアプリケーションにおいて、時間のかかる処理を非同期に行うために、バックグラウンドで順次処理していくような場合に利用 </li></ul>
  4. 4. キューってなんだっけ? <ul><li>いわゆる待ち行列で、コンピュータの基本的なデータ構造の一つ </li></ul><ul><li>データを先入れ先出し( FIFO : First In First Out )のリスト構造で保持するもの </li></ul><ul><li>キューからデータを取り出すときは、先に入れたデータから順に取り出される。 </li></ul><ul><li>キューにデータを入れることをエンキュー( enqueue )、取り出すことをデキュー( dequeue )という </li></ul><ul><li>キューとは逆に後入れ先出し( LIFO )の構造をスタックと呼ぶ </li></ul>
  5. 5. キューの構造 A B A C B A 1 2 3 A B C C B C 4 5 6 enqueue dequeue
  6. 6. スタックの構造 A B A C B A 1 2 3 A B A B A C 4 5 6 push pop
  7. 7. 早速Q4Mを使ってみよう
  8. 8. インストール 公式ページ( http://q4m.31tools.com )からソースをダウンロードして展開します。 # ./configure – with-mysql={ コンパイル済みの mysql のソースディレクトリ } – prefix={mysql ディレクトリ } # make # make install # mysql –u root –p < support-files/install.sql
  9. 9. 確認する 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; でも確認できます。
  10. 10. 動かしてみる 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
  11. 11. 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という結果が返ってきます。
  12. 12. mysql> SELECT queue_end(); +-------------+ | queue_end() | +-------------+ | 1 | +-------------+ 1 row in set (0.02 sec) dequeue して取り出した値を使った処理が完了した場合、 queue_end という function を呼ぶと、取り出した queue を削除しオーナーモードが解除されます。 処理中にエラーが発生した場合等は、 queue_abort という function を呼ぶと取り出した queue を戻すことができます。
  13. 13. オーナーモードについて Q4M では、 queue_wait を呼ぶとオーナーモードという状態になります。 オーナーモード中、そのコネクション内では queue_wait をコールした際に dequeue 対象の1行のレコードのみを取得できるようになります。 このとき、別のコネクションでは、他のコネクションでオーナーモードで取得している行以外が取得できます。
  14. 14. こんなこともできる
  15. 15. 条件をつけて dequeue mysql> SELECT queue_wait('queue_test:id>2'); +-------------------------------+ | queue_wait('queue_test:id>2') | +-------------------------------+ | 1 | +-------------------------------+ 1 row in set (0.00 sec) dequeue 時に条件をつけてキューを取得することができます。 テーブル名の指定のあとにコロンで条件を指定します。 複数条件や、複雑な条件は指定できないようです。
  16. 16. タイムアウト値を設定して dequeue 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 中にレコードがインサートされるとその時点で結果を返します。
  17. 17. 優先度で dequeue 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が返ります。
  18. 18. Q4M を使う上でやってはいけないこと <ul><li>複数行に対して1つの DELETE 文による削除を行う </li></ul><ul><ul><li>テーブルが壊れる </li></ul></ul><ul><li>queue_wait 中のレコードがある状態で truncate を行う </li></ul><ul><ul><li>テーブルが壊れる </li></ul></ul><ul><li>オーナーモード中は、 queue_wait しない </li></ul><ul><ul><li>レコードが消えてしまう </li></ul></ul>

×