Dai Chong's blog

思维导图

消息队列(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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class SendReminderEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

protected $id; // 接收外部传入的参数

/**
* Create a new job instance.
*
* @return void
*/
public function __construct($id)
{
$this->id = $id; // 接收外部传入的参数
}

/**
* Execute the job.
*
* @return void
*/
public function handle()
{
echo 'jobsss' . $this->id;
}
}
加入队列
1
2
3
use SendReminderEmail;
SendReminderEmail::dispatch($id); // 加入队列
ehco 1;
测试结果

 (1)当我未开启消息队列服务的情况下,直接请求接口,会返回1。
 (2)开启消息队列

消息队列的选择

 一般情况下大部分业务都使用的是redis的消息队列。加入你们公司业务量非常大,几千万甚至几亿就必须考虑使用其他的MQ工具。如ActiveMQRabbitMQRocketMQKafka

总结

 Laravel的消息队列应用比较简单且非常的好用,建议大家可以尝试一下。具体可以看官方文档


 评论