Database JUNKY

MySQL,MariaDBを中心としたブログです

MySQLでジョブキューを管理する(Q4M)

いまいちキューの概念がわかっていないのだが、ようはあれかな?非同期で、データをやりとりするもの?え?違う???たとえば、受注処理の場合とか、受注が完了するまでアプリケーションが待つのではなく、キューという形で一連の受注プロセスからデーモンという形で切り離すことで、待ち時間フリーな非同期処理が行えるってこと。え?違う? ぜんぜんよくわかっていないのですが、インストールと簡単な操作方法について記載しました

f:id:hit10231023:20180309104332j:plain

Q4Mのインストール

必要ライブラリのインストール(git clone含む)

yum install -y git gcc gcc-c++ bison perl-Data-Dumper
cd /usr/local/src
git clone git://github.com/kazeburo/mysetup.git
cd mysetup/q4m_mysql56
sh ./setup.sh

インストール後のmy.cnfの場所

変更が必要な場合はこの部分を適宜変更してください

cat /usr/local/q4m/etc/my.cnf

サービスの停止/起動

service q4m stop
MySQL-Q4M を停止中:                                        [  OK  ]
service q4m start                                                                                      
MySQL-Q4M を起動中:                                        [  OK  ]

q4mのコンソール起動

cd /usr/local/q4m/bin/
./mysql -u root 

バージョンの確認

mysql>
root@localhost mysql>SELECT @@version ;
+----------------+
| @@version      |
+----------------+
| 5.6.20-q4m-log |
+----------------+
1 row in set (0.00 sec)

mq用のアカウントを作成

mysql>
CREATE USER 'mq'@'%' identified by 'pass';

root@localhost mysql>CREATE DATABASE queue ;                                                                                           
Query OK, 1 row affected (0.00 sec)

root@localhost mysql>show create database queue ;                                                                                      
+----------+----------------------------------------------------------------+
| Database | Create Database                                                |
+----------+----------------------------------------------------------------+
| queue    | CREATE DATABASE `queue` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------------+

GRANT ALL PRIVILEGES ON queue .* TO 'mq'@'%' IDENTIFIED BY 'pass';

root@localhost mysql>SHOW GRANTS for 'mq'@'%';
+---------------------------------------------------------------------------------------------------+
| Grants for mq@%                                                                                   |
+---------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'mq'@'%' IDENTIFIED BY PASSWORD '*95EC2897C85AA2DFC2B12EAF696B7EF9A44990C3' |
| GRANT ALL PRIVILEGES ON `queue`.* TO 'mq'@'%'                                                     |
+---------------------------------------------------------------------------------------------------+

rootパスワードの変更

root@localhost mysql>SET PASSWORD = PASSWORD('qkqkqkqk');                                                                              
Query OK, 0 rows affected (0.00 sec)

キューのテーブルを作成する

ちなみに索引や、プライマリキーは作れないっぽい

mysql> 

USE queue ;

CREATE TABLE `amazon_queues` (
  `id` int(11) unsigned NOT NULL ,
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `msgid` varchar(250) NOT NULL,
  `msg` varchar(250) NOT NULL
) DEFAULT CHARSET=utf8 ENGINE=queue ;

動作確認

データととりあえずインサート(enqueue)してみる

mysql>
INSERT INTO amazon_queues (id,msgid,msg) 
VALUES 
  (1,'adkekx8afd0a89smfsaidjams','hello qkqkqkqk1'), 
  (2,'adkekx8af22222d0a89smfsaidjams','hello qkqkqkqk2') ,
  (3,'adkekxsadedwedwadawdwdjams','hello qkqkqkqk3')
;

デキュー(dequeue)する

queue_wait()を呼ぶとオーナーモードに入り、先述したように、そのコネクション内では1行のみ取得できるようになります。 また、別のコネクションでは、他コネクションでオーナーモードで取得した行以外を取得できるようになります。

SELECT queue_wait('amazon_queues');
+-----------------------------+
| queue_wait('amazon_queues') |
+-----------------------------+
|                           1 |
+-----------------------------+

キューからデータを取り出す

1件しか取り出せていないのがわかるかと思います

mysql>
SELECT * FROM amazon_queues;

+----+---------------------+---------------------+---------------------------+-----------------+
| id | created_at          | updated_at          | msgid                     | msg             |
+----+---------------------+---------------------+---------------------------+-----------------+
|  1 | 2016-10-03 18:10:39 | 2016-10-03 18:10:39 | adkekx8afd0a89smfsaidjams | hello qkqkqkqk1 |
+----+---------------------+---------------------+---------------------------+-----------------+

取り出して処理が完了したら、キューを終わらせる

これと同時にオーナーモードも終了するみたい

mysql>
SELECT queue_end();
+-------------+
| queue_end() |
+-------------+
|           1 |
+-------------+

オーナーモード終了時は通常のSELECTだと全件データが引けます

でも1のキューは処理済みなので、データはなくなっているのが確認できるかと思います

mysql>
+----+---------------------+---------------------+--------------------------------+-----------------+
| id | created_at          | updated_at          | msgid                          | msg             |
+----+---------------------+---------------------+--------------------------------+-----------------+
|  2 | 2016-10-03 18:10:39 | 2016-10-03 18:10:39 | adkekx8af22222d0a89smfsaidjams | hello qkqkqkqk2 |
|  3 | 2016-10-03 18:10:39 | 2016-10-03 18:10:39 | adkekxsadedwedwadawdwdjams     | hello qkqkqkqk3 |
+----+---------------------+---------------------+--------------------------------+-----------------+