Mysql的消息队列插件Q4M
Q4M(queue for mysql) 是开源的实现队列功能的mysql存储引擎,目前支持mysql 5.1 以上的版本
它已经内置了对多连接并发的的支持,能保证一个消息只能被同一个connection获取到
参考http://q4m.31tools.com/,现在最新的版本是0.8.9
最近,邮箱有一个活动,需要给登录的用户即时发对应的优惠券
开始使用了传统的方法,从mysql的一个表中通过limit来读取一条记录,并更新
但由于这次活动瞬间并发量比较大,这种方法会造成数据库的堵塞
于是,考虑试试Q4M,使用了其二进制方式安装,安装很简单:
1. tar zxvf mysql-5.1.41-linux-x86_64-glibc23-with-fast-mutexes-q4m-0.8.9.tar.gz
2. cd q4m-0.8.9-linux-x86_64
3. cp support-files/q4m-forward /usr/local/mysql/bin/
4. cp libqueue_engine.so /usr/local/mysql/lib/plugin/
5. mysql --socket=/data/mysql/mysql.sock < support-files/install.sql
注意:如果mysql是下载的二进制压缩包,则它默认把with-fast-mutexes已经编译进去了
所以,对应的Q4M的包也需要是with-fast-mutexes-q4m-0.8.9.tar.gz的,而不是 without-fast-mutexes-q4m-0.8.9.tar.gz
如果使用源码编译安装:
1.tar zxvf q4m-0.9.2.tar.gz
2../configure --with-mysql=/opt/ysz/src/mysql-5.1.44 --prefix=/usr/local/mysql5.1.44/
3. 可能会报错:my_global.h:80:23: error: my_config.h: No such file or directory
4. 首先cd /opt/ysz/src/mysql-5.1.44/;make,然后再
5. vi /opt/ysz/src/mysql-5.1.44/include/my_global.h
6. my_config.h修改为config.h
7. make;make install
8. /usr/local/mysql5.1.44/bin/mysql --socket=/opt/mydata/my3310/my3310.sock < support-files/install.sql
安装后,即可使用其提供的sql进行查询了
目前,Q4M似乎不支持记录二进制log,所以在insert之前需要把log给关闭,这样造成的后果是:
使用了Q4M后,就无法使用Mysql的Master和Slave机制了
1. #创建queue引擎的表结构
2. create table product_detail (productid int,cardid varchar(1000)) ENGINE=queue charset=gbk;
3. #不记录二进制log
4. SET SQL_LOG_BIN=0
5. #使用普通的sql语句插入数据,也可使用load data infile来批量灌入数据
6. insert into product_detail values(1,'1');
7. #使用queue_wait来获取productid为2的一条数据,设置超时时间为1秒
8. select cardid from product_detail where queue_wait('product_detail:productid=2',1);
9. #处理完成删除刚才获取的那条数据
10. select queue_end()
11. #处理完成后也可以不删除对应的数据,而释放对应的数据,它将仍然留在队列中
12. select queue_abort()