Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Q4 Mでメッセージキュー

3,443 views

Published on

  • Be the first to comment

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>

×