mysql 来模拟消息队列

队列跟栈一样,是一种线性的表结构,但它是一种FIFO(先进先出)的数据结构,后断插入操作,前端删除操作。
在大数据量和高并发的WEB应用里,队列工具可以大展拳脚。
下面以社区SNS好友信息动态分发为例,讲解简单的队列在消息调度机制中的实现跟使用。
如果莫个人发布了一条动态,进行入库和网络分发的过程都需要频繁不间断的读写数据库。这样就给服务器照成了很大的压力,可以采用一种异步处理的思想来解决问题。消息发送很简单,动态产生以后,往DATABASE里头插入一条记录即可,消息的接受过程是采用定时轮询的机制。
  我们用数据库模拟消息队列,新建一个消息对列表,此处略去 ...只简单说明一下就行,字段是:消息生产者的UID,消息内容DATA,消息类别TOPIC,状态信息 static等等,消息队列表完毕,然后就需要一个队消息队列进行轮询调度的程序,这里通过两个存储过程跟定时器来实现。

下面就是一个消息的分发过程(存储过程实现的)
  DROP PROCEDEURE IF EXISTS 'proc_msg_rece_friend';
DELIMITER //
CREARE PROCEDURE 'pro_msg_rece_friend'()
BEGIN
//当出现SQL错误的时候,中断程序执行过程,跳出存储过程,并启用事务回滚
DECLARE CONTIUNE HANDLER FOR SQL EXCEPTION ROLLBACK;
START TRANSACTION;
INSERTINTO tablename
select *,*,*,*from(select * from * where)temp where *=*;
UPDATE tablename set * =1 where *;
COMMIT;
END //

下面就是调度程序,来实现分发策略,合适分发跟频率等。可以利用mysql 的event实现调度,比如5分钟调用一次存储过程等等,将队列 的数据进行分发。下面是消息接受后的清除器的event 。
DROP EVENT IF EXISTS 'event_msg_clean';
//ON SCHEDULE 计划任务,有两种设定计划任务的方式:
//1. AT 时间戳,用来完成单次的计划任务。
//2. EVERY 时间(单位)的数量时间单位[STARTS 时间戳] [ENDS时间戳],用来完成重复的//计划任务。
//ON COMPLETION参数表示"当这个事件不会再发生的时候",即当单次计划任务执行完毕后或
//当重复性的计划任务执行到了ENDS阶段。而PRESERVE的作用是使事件在执行完毕后不会被
//Drop掉,建议使用该参数,以便于查看EVENT具体信息。
//[ENABLE | DISABLE]
//参数Enable和Disable表示设定事件的状态。Enable表示系统将执行这个事件。Disable表示//系统不执行该事件。

CREATE EVENT 'event_msg_clean' ON SCHEDULE EVERY 1 HOUR STARTS '2014-1-1 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO delete from ens_enentqueue(表名) where status =1 //

注:当消息量特别大时,可把消息放入内存中,或进行集群分发,向金山公司的HTTPSQL集合了NOSQL技术,得到了更快的数度和更高的并发量,开源的产品有ZEROMQ,提供了丰富的API,此外,JMS也是一个简单高速,功能强大的消息队列。好,就讨论到这里。






猜你喜欢

转载自e4222014.iteye.com/blog/2082692