centos8安装rabbitmq
一 RabbitMQ下载
RabbitMQ 官网最新版下载:
https://www.rabbitmq.com/tutorials
RabbitMQ v4.1.0-beta.2版本下载:
https://github.com/rabbitmq/rabbitmq-server/releases/download/v4.1.0-beta.2/rabbitmq-server-4.1.0.beta.2-1.el8.noarch.rpm
RabbitMQ依赖Erlang 26.2.5.12下载:
https://github.com/rabbitmq/erlang-rpm/releases/download/v26.2.5.12/erlang-26.2.5.12-1.el8.x86_64.rpm
erlang和rabbitmq的版本的兼容: https://www.rabbitmq.com/docs/which-erlang
二 RabbitMQ安装
1 安装erlang环境
安装RabbitMQ前要先安装erlang环境,因为RabbitMQ是用erlang开发的
执行安装指令如下:
rpm -ivh erlang-26.2.5.12-1.el8.x86_64.rpm 或 dnf install -y erlang-26.2.5.12-1.el8.x86_64.rpm
验证 erlang 安装是否成功,执行erl可以查看版本,说明安装成功
erl -version
2 安装RabbitMQ
执行安装RabbitMQ指令如下:
rpm -ivh rabbitmq-server-4.1.0.beta.2-1.el8.noarch.rpm 或 dnf install -y rabbitmq-server-4.1.0.beta.2-1.el8.noarch.rpm
安装结束后,消息队列数据保存在哪?日记在哪?想了解更多的信息?
rabbitmq-diagnostics status
3 RabbitMQ 启动与关闭
#启动 systemctl start rabbitmq-server #停止关闭 systemctl stop rabbitmq-server #重启 systemctl restart rabbitmq-server #开机启动 systemctl enable rabbitmq-server #查看状态 systemctl status rabbitmq-server
4 开启RabbitMQ的Web管理界面
rabbitmq-plugins enable rabbitmq_management
#新增人员 rabbitmqctl add_user admin admin #设置权限 rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" #设置为管理员 rabbitmqctl set_user_tags admin administrator
*
表示授予该用户对该虚拟主机上所有队列和交换机的 configure
、write
和 read
权限。
- 第一个
".*"
表示用户可以配置任意队列和交换机。 - 第二个
".*"
表示用户可以向任意队列和交换机发送消息。 - 第三个
".*"
表示用户可以从任意队列中消费消息。
5 虚拟主机
虚拟主机(vhost)是 RabbitMQ 中的一种逻辑隔离机制,它相当于一个独立的命名空间。每个虚拟主机内部可以拥有自己独立的队列、交换机、绑定等资源,彼此之间相互隔离,不能共享资源。
命名空间:每个虚拟主机都有自己的队列、交换机、绑定等资源。
资源隔离:不同虚拟主机之间的资源(如队列和交换机)完全隔离,防止不同应用间的资源冲突。
用户权限:不同的用户可以被授予不同虚拟主机的访问权限,确保用户只能访问指定的虚拟主机中的资源。
虚拟主机提供了一种隔离和权限管理的方式,适用于以下场景:
多租户架构:在 SaaS(软件即服务)或多租户应用中,你可以为不同的租户创建不同的虚拟主机,以确保数据隔离。
开发与生产环境隔离:你可以为开发环境和生产环境创建不同的虚拟主机,避免资源冲突和干扰。
权限管理:不同的用户或应用可以通过虚拟主机进行权限分离,确保只有特定用户才能访问某些资源。
默认虚拟主机
RabbitMQ 默认创建一个虚拟主机 /,这是一个特殊的虚拟主机,通常用于测试或默认情况下的资源管理。生产环境中,建议创建和使用新的虚拟主机,以更好地管理资源和权限。
虚拟主机操作也非常简单,如下图:
在用户管理界面选择用户绑定指定的虚拟主机,非常方便,如下图:
php 使用 rabbitmq
1. 安装php-amqplib
composer require php-amqplib/php-amqplib
2. 发送持久化消息
在发送消息时,你需要设置delivery_mode
为2,这表示消息将会被持久化。同时,确保队列也是持久的。
下面是一个示例代码,展示如何发送一个持久化的消息:
<?php require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPStreamConnection; use PhpAmqpLib\Message\AMQPMessage; // 连接到RabbitMQ服务器 $connection = new AMQPStreamConnection('localhost', 5672, 'your_user', 'your_password'); $channel = $connection->channel(); // 确保队列是持久的 $channel->queue_declare('hello', false, true, false, false); // 创建一个新的消息实例,并设置持久化模式 $msg = new AMQPMessage('Hello World!', ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]); // 发送消息到队列 $channel->basic_publish($msg, '', 'hello'); echo " [x] Sent 'Hello World!'\n"; // 关闭连接 $channel->close(); $connection->close();
3. 接收持久化消息
接收端不需要特别设置来接收持久化消息,因为RabbitMQ保证一旦消息被确认(acknowledged),就会被删除。但是,你应该确保消费者正确处理了ack(确认)机制,以避免重复消费或丢失消息。
下面是一个简单的消费者示例:
<?php require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPStreamConnection; use PhpAmqpLib\Message\AMQPMessage; $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest'); $channel = $connection->channel(); // 声明持久化队列(需与生产者保持一致) $channel->queue_declare('hello', false, true, false, false); $callback = function ($msg) { echo ' [x] Received ', $msg->body, "\n"; // 业务处理逻辑... sleep(substr_count($msg->body, '.')); // 模拟任务耗时 echo " [x] Done\n"; $msg->ack(); // 手动确认消息 }; // 设置QoS预取计数(限制未确认消息数) $channel->basic_qos(null, 1, null); // 开启手动确认模式 $channel->basic_consume( 'hello', '', false, false, false, false, $callback ); while ($channel->is_consuming()) { $channel->wait(); }
转 : https://blog.csdn.net/qyhua/article/details/141424830