思维导图
消息队列(MQ)
什么是消息队列(MQ)
关于消息队列大家肯定都不陌生,基本上每个项目中都会使用到的技术,在我前几期的博文中也有介绍。
消息队列本质就是逻辑执行顺序,队列就如同一摞碗堆放在一起,你每放一个碗都会放在这螺碗的最上面,当你拿碗的时候也是只能从最上面拿。这个如同队列的消费特性(队列的特性是先进先出,先进后出,道理是一样的)。
为什么要使用消息队列?
- 提高系统性能(削峰,减少响应时间)。
1
2
3
4
5
6
7# 假设你有一个这样的接口
# 新用户注册发送邮件验证码
public function SendMailCode(Request $request){
$mail = $request->input('mail);
SendReminderEmail::dispatch($mail); // 把邮箱加入队列
return '验证码发送成功,请注意查收!';
}
假设注册接口的并发在1秒100,在使用队列的情况下发送邮件这个操作是异步的,也就是说当第100名用户点击获取验证码后立刻就能获得响应,无需等待前99名所有邮件发送成功后才能得到相应,这就是不阻塞。
当SendReminderEmail::dispatch($mail)
执行之后立刻就会执行 return '验证码发送成功,请注意查收!'
,控制器不需要知道邮件是否发送成功,减少了阻塞的等待时间。
- 降低系统的耦合性。
传统写法 消息队列(MQ)写法消息队列(MQ)的优缺点
- 优点:上边已经讲过了。
- 缺点:
(1)系统可用性降低:可以看出引入了MQ之后,如果MQ挂了相当于整个日志系统也随之崩溃。
(2)系统复杂性提高:引入MQ增加了维护系统的工作量,出现问题的可能性会更高。
(3)一致性问题。
队列的应用
Laravel中的消息队列就非常简单了,他可以设置驱动和执行方式。
安装扩展
- aws/aws-sdk-php ~3.0
- pda/pheanstalk ~3.0
- predis/predis ~1.0
生成任务类
1 | php artisan make:job SendReminderEmail |
任务类结构
1 |
|
加入队列
1 | use SendReminderEmail; |
测试结果
(1)当我未开启消息队列服务的情况下,直接请求接口,会返回1。
(2)开启消息队列
消息队列的选择
一般情况下大部分业务都使用的是redis的消息队列。加入你们公司业务量非常大,几千万甚至几亿就必须考虑使用其他的MQ工具。如ActiveMQ
、RabbitMQ
、RocketMQ
、Kafka
。
总结
Laravel的消息队列应用比较简单且非常的好用,建议大家可以尝试一下。具体可以看官方文档。