Q4 Mでメッセージキュー

  • 2,814 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,814
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
13
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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