业务场景
会员注册成功之后,发送成功的短信邮件,传统的做法就是在会员注册成功的程序上面做一个发送短信的代码,增加发送邮件的代码,
假设会员注册的执行需要1秒,发送短信1秒,发送邮件1秒,那么会员注册总共需3秒
为了增加更大的并发量,我们引入消息队列,会员注册成功之后,就将成功的消息写入消息队列,比如手机号等等. 然后分别做一个发送短信的和发送邮箱的
服务程序,这样就可以将程序的时间节省到 1 1秒.
有人说了,存到数据库也可以啊,当然可以,只是这个消息不需要长期存储,用完就清掉了,没必要做存到数据库啊.
应对秒杀的场景,秒杀是突然好几倍的流量进来,数据库就会承担不了,那么就可以用消息队列来存储秒杀数据,然后订单系统再按串行处理秒杀数据,保证
数据库不崩溃.限制抢购的数量,也可以用消息队列来做,1000商品=1000消息队列,之后的就可以不用查询数据库,直接返回无货.
消息队列的产品很多,这次我们来学习一下微软的产品MSMQ吧.
1
安装消息队列
2
消息队列是什么
消息队列就是信息的队伍,排先进先出顺序排序的
可以有多少队列,每个队列有多条消息
3 VFP创建一个消息队列
lcQueueName = "MyQueue1" &&消息队列的名字
oQueueInfo = CreateObject("msmq.msmqqueueinfo")
*--私有队列 工作组模式可用 .Private$
*--公有队列 .
oQueueInfo.Pathname = ".Private$" lcQueueName &&must be unique
oQueueInfo.Label = lcQueueName
oQueueInfo.Create &&消息队列不可以重复创建
可以打开计算机管理,查看到我们刚刚创建的消息队列
3
写入一条消息
*发送消息
lcQueueName = "MyQueue1" &&消息队列的名字
oQueueInfo = CreateObject("msmq.msmqqueueinfo")
oQueueInfo.Pathname = ".Private$" lcQueueName &&must be unique
oQueueInfo.Label = lcQueueName
* 以下第一个参数为,打开队列的访问(send、peek、receive)模式。
*!*MQ_RECEIVE_ACCESS 1
*!*MQ_SEND_ACCESS 2
*!*MQ_PEEK_ACCESS 32
*!*MQ_ADMIN_ACCESS 128
oSendQueue= oQueueInfo.Open(2, 0)
*创建消息
oMsg = create("msmq.msmqmessage")
oMsg.Label = "我是第一条消息"
oMsg.Body = "我是第一条内容"
oMsg.Send(oSendQueue)
4
读取消息
oMsg = Create("msmq.msmqmessage")
lcQueueName = "myQueue1"
oQueueInfo = Createobject("msmq.msmqqueueinfo")
oQueueInfo.Pathname = ".Private$" lcQueueName
&&接收模式
oSendQueue= oQueueInfo.Open(1, 0)
oMsg = oSendQueue.Receive(,,,100) &&得到消息
If Isnull(oMsg)
Return
Endif
Messagebox(oMsg.Body, 0, oMsg.Label)
5
删除队列
lcQueueName = "myQueue1"
oQueueInfo = create("msmq.msmqqueueinfo")
oQueueInfo.Pathname = ".Private$" lcQueueName
oQueueInfo.Delete
6
接收消息但不删除
oSendQueue.Peek(,,,100) &&接收消息但不删除