欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux下RabbitMQ的安装及使用

程序员文章站 2022-05-18 14:47:15
...

一、RabbitMQ安装

1.下载Erlang的rpm包

  RabbitMQ是Erlang语言编写,所以Erang环境必须要有,注:Erlang环境一定要与RabbitMQ版本匹配:https://www.rabbitmq.com/which-erlang.html

  Erlang下载地址:https://www.rabbitmq.com/releases/erlang/(根据自身需求及匹配关系,下载对应rpm包)

2.下载RabbitMQ的rpm包

  RabbitMQ下载地址:https://www.rabbitmq.com/releases/rabbitmq-server/(根据自身需求及匹配关系,下载对应rpm包)

3.下载socat的rpm包

  rabbitmq安装依赖于socat,所以需要下载socat。

  socat下载地址:http://repo.iotti.biz/CentOS/6/x86_64/socat-1.7.3.2-1.el6.lux.x86_64.rpm

  根据自身需求下载对应系统socat依赖:(http://repo.iotti.biz/CentOS/)

4.分别安装Erlang、Socat、RabbitMQ(一定按照顺序!)

Linux下RabbitMQ的安装及使用

  一定按照以下顺序安装

  ①rpm -ivh erlang-18.3-1.el6.x86_64.rpm

  ②rpm -ivh socat-1.7.3.2-1.el6.lux.x86_64.rpm

  ③rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm 

5.配置rabbitmq:vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app

  Linux下RabbitMQ的安装及使用

 6.安装管理插件:rabbitmq-plugins enable rabbitmq_management

Linux下RabbitMQ的安装及使用

 6.启动RabbitMQ,浏览器访问:http://192.168.64.128:15672/,出现以下界面说明安装完成!

  ①cd /usr/lib/rabbitmq/bin

  ②./rabbitmq-server start

Linux下RabbitMQ的安装及使用

回到顶部

 二、RabbitMQ的5种模式

1、简单模式(一对一的发送)

Linux下RabbitMQ的安装及使用

 

 ①生产者发送消息给交换机

②交换机接收消息,如果交换机没有绑定队列,消息扔进垃圾桶

③队列接收消息,存储在内存,等待消费者连接监听获取消息,消费成功后,返回确认

一些场景:短信,QQ

2、工作模式(资源的争抢)

Linux下RabbitMQ的安装及使用

 

 ①生产者将消息发送给交换机

②交换机发送给绑定的后端队列

③一个队列被多个消费者同时监听,形成消息的争抢结构:根据消费者所在的系统的空闲、性能争抢队列中的消息

一些场景:抢红包

3、发布订阅(交换机类型为fanout)

Linux下RabbitMQ的安装及使用

 

 注:图中未画消费者

①交换机定义类型为:fanout

②交换机绑定多个队列

③生产者将消息发送给交换机,交换机复制同步消息到后端所有的队列中

一些场景:邮件群发

4、路由模式(交换机类型:direct)

Linux下RabbitMQ的安装及使用

 

①交换机定义类型为:direct

②交换机绑定多个队列,队列绑定交换机时,给交换机提供了一个routingkey(路由key)

③发布订阅时,所有fanout类型的交换机绑定后端队列用的路由key都是“”;在路由模式中需要绑定队列时提供当前队列的具体路由key

一些场景:错误消息的接收和提示

5、主题模式(交换机类型:topic)

Linux下RabbitMQ的安装及使用

 

①交换机定义类型为:topic

②交换机绑定多个队列,与路由模式非常相似,做到按类划分消息

③路由key队列绑定的通配符如下:#表示任意字符串,*表示没有特殊符号(单词)的字符串

三、RabbitMQ使用Demo

默认账号:guest

默认密码:guest

我们创建个admin管理员账号:

Linux下RabbitMQ的安装及使用

以admin管理员登录创建个test_host:

Linux下RabbitMQ的安装及使用

此处还需为admin(此处我的账号是zg)分配虚拟用户test_host(此处我的是zg_test)

Linux下RabbitMQ的安装及使用

Linux下RabbitMQ的安装及使用

 

三、Hello World

这里我以Yii框架为例介绍如何使用RabbitMQ,需要使用composer下载php-amqplib。

composer require php-amqplib/php-amqplib

 

生产者:

Linux下RabbitMQ的安装及使用

<?php

namespace app\commands;

use yii\console\Controller;
use PhpAmqpLib\Message\AMQPMessage;
use PhpAmqpLib\Connection\AMQPStreamConnection;

class ProductController extends Controller
{
    public function actionIndex()
    {
        $conn = new AMQPStreamConnection('localhost', 5672, 'admin', 'admin', 'test_host');
        $channel = $conn->channel();

        $msgBody = 'Hello White Rabbit!';

        $msg = new AMQPMessage($msgBody, ['content_type' => 'text/plain', 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
        //声明一个队列,所有的参数会在下一篇文章介绍
        $channel->queue_declare('white', false, true, false, false, false);
        //将消息发送到队列,这里并不是直接将消息发送到队列,而是通过交换机间接发送到队列
        $channel->basic_publish($msg, '', 'white');

        echo "product: send msg success\n";
    }
}

Linux下RabbitMQ的安装及使用

控制台:

php yii product

Linux下RabbitMQ的安装及使用

RabbitMQ出现了一个white队列,里面有一条消息未被消费:

Linux下RabbitMQ的安装及使用

 

消费者:

Linux下RabbitMQ的安装及使用

<?php

namespace app\commands;

use yii\console\Controller;
use PhpAmqpLib\Connection\AMQPStreamConnection;

class ConsumeController extends Controller
{
    public function actionIndex()
    {
        $conn = new AMQPStreamConnection('localhost', 5672, 'admin', 'admin', 'test_host');
        $channel = $conn->channel();

        $callback = function ($msg) {
            if (true) {
                echo "consume: " . $msg->body . "\n";
                //确认消费
                $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
            } else {
                //进行回滚操作
            }
        };

        /*
         * prefetch_count = 1,一次只消费一条消息
         * no_ack = false,消费成功后回复ack
         */
        $channel->basic_qos(null, 1, null);
        $channel->queue_declare('white', false, true, false, false, false);
        $channel->basic_consume('white', '', false, false, false, false, $callback);

        while (count($channel->callbacks)) {
            $channel->wait();
        }
    }
}

Linux下RabbitMQ的安装及使用

控制台:

php yii consume

Linux下RabbitMQ的安装及使用

此时white队列中的一条消息已经被消费:

Linux下RabbitMQ的安装及使用