MQ
MQ 全称 Message Queue
(消息队列),是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。
为什么需要mq:
- 解耦:MQ能够使各个系统或组件之间解耦,降低它们之间的耦合度,提高系统的灵活性和可维护性
- 异步处理:通过MQ可以实现异步处理,提高系统响应速度和吞吐量。
- 削峰:在高流量时段,MQ可以缓冲突增的请求,减轻下游系统的瞬时压力。
- 可靠性:MQ通常提供持久化选项,确保消息不会因为网络问题或服务故障而丢失。
- 扩展性:MQ支持分布式部署,可以根据系统需求灵活扩展。
- 灵活性和路由:MQ支持多种消息路由方式,如直接、主题、扇形等,以适应不同的业务场景。
- 多语言支持:大多数MQ支持多种编程语言,使得开发者可以使用自己熟悉的语言进行开发。
RabbitMQ
RabbitMQ
是一个开源的,基于 AMQP(Advanced Message Queue 高级消息队列协议)
协议,可复用的企业消息系统。 支持主流的操作系统,Linux、Windows、MacOs
等 多种开发语言支持,Java、Python、Ruby、.NET、PHP、C/C++、node.js
等
安装
本文安装 RabbitMQ
的系统为 centos7
- 更新系统包:首先更新系统中的软件包。
yum -y update
- 安装
EPEL
存储库:因为Erlang
不在默认的YUM
存储库中,需要安装EPEL
存储库。
yum -y install epel-release yum -y update
- 安装
Erlang
:RabbitMQ
是基于Erlang
开发的,因此需要先安装Erlang
。可以通过以下方式安装Erlang
:
- 从
Erlang
官网下载Erlang
存储库rpm包
并安装。 - 或者使用以下命令直接安装
Erlang和socat(RabbitMQ依赖)
:
yum -y install erlang socat
- 检查Erlang版本:确认Erlang是否安装成功并检查版本.
erl -version
显示这种版本信息的表示是老版本,需要执行:
erl
其中这个
Erlang R16B03-1
就是对应rabbitmq
需要的erlang 环境的版本
在 rabbitmq
官网查询 erlang的关联版本
由于我这个是老版本的erlang 所以需要划到最下面
- 下载RabbitMQ:下载RabbitMQ的rpm包。
上面我们查询到的 rabbitmq
对应的版本是 3.6.14,所以我们下载对应的版本
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/rabbitmq_v3_6_14/rabbitmq-server-3.6.14-1.el6.noarch.rpm
github 上面 rabbitmq
的历史版本查看
- 安装RabbitMQ:使用rpm命令安装下载的RabbitMQ包。
rpm -ivh rabbitmq-server-3.6.14-1.el6.noarch.rpm
- 启动RabbitMQ服务:启动RabbitMQ服务,并设置开机自启。
# 启动 systemctl start rabbitmq-server # 开机启动 systemctl enable rabbitmq-server
- 安装管理界面插件:安装RabbitMQ的管理界面插件以便于管理。
rabbitmq-plugins enable rabbitmq_management
- 配置防火墙:如果服务器运行的是防火墙,需要开放RabbitMQ使用的端口,如5672和15672
firewall-cmd --zone=public --add-port=5672/tcp --permanent && firewall-cmd --reload firewall-cmd --zone=public --add-port=15672/tcp --permanent && firewall-cmd --reload
- 创建用户:创建非默认用户以允许远程访问。
rabbitmqctl add_user 用户名 密码 rabbitmqctl set_user_tags 用户名 administrator rabbitmqctl set_permissions -p "/" 用户名 ".*" ".*" ".*"
- 启动服务并检查状态:
systemctl start rabbitmq-server systemctl status rabbitmq-server
打开浏览器,输入网址:http://****:15672,出现以下界面说明安装成功了
默认用户 guest guest 只能本机登录
主页概述
connections
:无论生产者还是消费者,都需要与RabbitMQ建立连接后才可以完成消息的生产和消费,在这里可以查看连接情况channels
:通道,建立连接后,会形成通道,消息的投递获取依赖通道。Exchanges
:交换机,用来实现消息的路由Queues
:队列,即消息队列,消息存放在队列中,等待消费,消费后被移除队列。
laravel 对接rabbitmq
laravel
对接rabbitmq
有对应的composer
包:laravel-queue-rabbitmq
composer require vladimir-yuldashev/laravel-queue-rabbitmq
安装
查看对应 laravel
的版本,和 laravel-queue-rabbitmq
是否对应
composer 包网址:
本文用的laravel 版本为 9.33.0
- 查看版本是否对应
laravel-queue-rabbitmq
对 illuminate/queue
版本有要求,参照下列:
laravel 自带 illuminate/queue
版本查看:vendor->laravel->scout->composer.json
- 安装对应版本的包
composer require vladimir-yuldashev/laravel-queue-rabbitmq:^13.1.0 -vvv
配置
找到 config->queue.php
文件,添加以下配置:
'rabbitmq' => [ 'driver' => 'rabbitmq', 'hosts' => [ [ 'host' => env('RABBITMQ_HOST', '127.0.0.1'), 'port' => env('RABBITMQ_PORT', 5672), 'user' => env('RABBITMQ_USER', 'guest'), 'password' => env('RABBITMQ_PASSWORD', 'guest'), 'vhost' => env('RABBITMQ_VHOST', '/'), ], ], 'worker' => env('RABBITMQ_WORKER', 'default'),//设置队列管理器 ],
在env里面设置值:
#队列配置 QUEUE_CONNECTION=rabbitmq RABBITMQ_HOST=192.168.18.130 RABBITMQ_PORT=5672 RABBITMQ_USER=test RABBITMQ_PASSWORD=test # 设置队列管理器:horizon #RABBITMQ_WORKER=horizon
使用
laravel 队列使用文档:
- 创建任务
php artisan make:job Test
这个命令会创建一个test的任务类
- 编辑任务类
namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; class Test implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; //队列返回的数据 protected $data; /** * Create a new job instance. * * @return void */ public function __construct($data) { $this->data = $data; } /** * Execute the job. * * @return void */ public function handle() { //队列消费逻辑,此处就简单的打印一下 var_dump($this->data); } }
- 发送队列消息
创建一个测试控制器,并编写测试消息
namespace App\Http\Controllers; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Http\Request; use Illuminate\Routing\Controller as BaseController; class TestController extends BaseController { public function test(){ \App\Jobs\Test::dispatch([ 'name'=>'这是一个测试队列', 'data'=>[ 'age'=>18, 'sex'=>1 ] ]); } }
- 请求接口创建消息
查看 rabbitmq
面板,消息如下:
- 运行队列,消息消息
在项目根目录命令窗口执行以下命令:
php artisan queue:work
总结
laravel-queue-rabbitmq
包为 Laravel
开发者提供了一个强大且灵活的方式来使用 RabbitMQ
作为消息队列解决方案,从而增强应用程序的异步处理能力和系统解耦。