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