资讯专栏INFORMATION COLUMN

RabbitMQ使用

codeKK / 1069人阅读

摘要:的定义是使用语言开发的开源消息队列系统,完整的实现了高级抽象层消息通信协议。交换机接受发送的消息,并根据绑定规则转发到对应的队列。默认是无名交换使用空字符串标识。消息队列是内部对象,用于存储未被消费的消息。

RabbitMQ的定义

RabbitMQ是使用erlang语言开发的开源消息队列系统,完整的实现了AMPQ(高级抽象层消息通信协议)。

Mac下RabbitMQ安装

使用Homebrew安装

$ brew install rabbitmq

修改 ~/.bash_profile 配置环境变量:

# RabbitMQ Config
export PATH=$PATH:/usr/local/sbin

重启配置

$ source ~/.bash_profile

启动mq服务(后台启动为rabbitmq-server -detached)

$ rabbitmq-server 

登录管理界面 http://127.0.0.1:15672 账号密码为:guest

客户端

RabbitMQ官方提供了三种PHP可用的扩展:php-amqp,php-rabbit,php-amqplib

php-amqplib 安装

php的客户端现在常用的是php-amqplib

直接拉取github上面的代码
    $ git clone https://github.com/php-amqplib/php-amqplib.git
composer安装(官网提供)

将composer.json文件添加到您的项目中

{

 “require”:{
     “php-amqplib / php-amqplib”:“> = 2.6.1”
}

}

下载依赖

$ composer install

概念

Virtual vhosts

virtual vhosts是一个命名空间,可以存在多个exchange和queue。实现了环境(用户,用户组,exchange,queue)隔离,是权限控制的最小粒度。默认的virtual host为/。

Exchange(交换机)

接受producer发送的消息,并根据binding绑定规则转发到对应的队列。默认是无名交换使用空字符串标识。exchange type(交换机类型)包含四种类型:direct,topic,headers,fanout

direct

转发消息到routigKey指定的队列

topic

类似于direct类型,只不过routigKey为一个句点号“.”分隔的字符串

*可以替代一个字。

#可以替换零个或多个单词。

headers

根据发送的消息内容中的headers属性进行匹配。

fanout

将所有收到的消息广播到所有已知的队列。

Queue(消息队列)

queue是mq内部对象,用于存储未被customer消费的消息。相同属性的queue可以重复定义,每个消息都会被投入到一个或多个队列。

Binding(绑定)

binding是将exchange和queue按照路由规则绑定起来。可以理解为binding是exchange和queue之间的关系

Connection(连接)

消息tcp连接

Channel(信道)

每个connection里,可建立多个channel,每个channel代表一个会话任务。做到尽量共用connection

RabbitMQ使用示例

1.send.php:

    require_once __DIR__ . "/vendor/autoload.php";
    use PhpAmqpLibConnectionAMQPStreamConnection;
    use PhpAmqpLibMessageAMQPMessage;

    // 创建连接
    $connection = new AMQPStreamConnection("localhost", 5672, "guest", "guest");
    // 创建channel,多个channel可以共用连接
    $channel = $connection->channel();

    // 创建交换机以及队列(如果已经存在,不需要重新再次创建并且绑定)

    // 创建直连的交换机
    $channel->exchange_declare("direct_logs", "direct", false, false, false);
    // 创建队列
    $channel->queue_declare("hello", false, false, false, false);
    // 交换机跟队列的绑定,
    $channel->queue_bind("hello", "direct_logs", "routigKey");


    // 设置消息bady传送字符串logs(消息只能为字符串,建议消息均json格式)
    $msg = new AMQPMessage("logs");
    // 发送数据到对应的交换机direct_logs并设置对应的routigKey
    $channel->basic_publish($msg, "direct_logs", "routigKey");

2.receive.php:

    require_once __DIR__ . "/vendor/autoload.php";
    use PhpAmqpLibConnectionAMQPStreamConnection;

    // 创建连接
    $connection = new AMQPStreamConnection("localhost", 5672, "guest", "guest");
    // 创建channel,多个channel可以共用连接
    $channel = $connection->channel();

    // 可能会在数据发布之前启动消费者,所以我们要确保队列存在,然后再尝试从中消费消息。

    // 创建直连的交换机
    $channel->exchange_declare("direct_logs", "direct", false, false, false);
    // 创建队列
    $channel->queue_declare("hello", false, false, false, false);
    // 交换机跟队列的绑定,
    $channel->queue_bind("hello", "direct_logs", "routigKey");

    // 回调函数
    $callback = function ($msg) {
        echo $msg->body;
    };

    // 启动队列消费者
    $channel->basic_consume("hello3", "", false, true, false, false, $callback);
    // 判断是否存在回调函数
    while(count($channel->callbacks)) {
        // 此处为执行回调函数
        $channel->wait();
    }

RabbitMQ备注

非持久化会导致,队列重启,数据丢失

exchange持久化,在声明durable参数时指定为true

queue持久化,在声明durable参数时指定true

消息持久化,实例化AMQPMessage类时指定delivery_mode为2

exchange和queue是否持久化需要一致才能绑定

消费者设置手动ack,在声明no_ack参数时指定false

队列消息异常需要将消息删除并再次发送同样的消息置于末尾并手动记录日志

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26097.html

相关文章

  • 基于RabbitMQ的MQTT插件搭建MQTT服务,使用MQTTX进行收发测试

    摘要:本文基于的插件,针对进行简单的测试。包括协议的介绍,的安装配置开启插件及基于进行的测试。协议是基于发布订阅模型的物联网消息传递协议。对传输消息有三种服务质量最多一次,这一级别会发生消息丢失或重复,消息发布依赖于底层网络。 ...

    ymyang 评论0 收藏0
  • RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例

    摘要:进行插入操作的端称为队尾,进行删除操作的端称为对头。还有个专业术语要了解下生产者发送消息的应用程序被称为生产者。消费者接收消息的应用程序被称为消费者。参考链接下安装及操作常用命令译实战教程一你是否听说过或者使用过队列? 你是否听说过或者使用过消息队列? 你是否听说过或者使用过RabbitMQ? 提到这几个词,用过的人,也许觉得很简单,没用过的人,也许觉得很复杂,至少在我没使用消息队列之前,听...

    SegmentFault 评论0 收藏0
  • Spring Boot 配置多源的 RabbitMQ

    摘要:简介是开发中很平常的中间件,本文讲述的是怎么在一个项目中配置多源的,这里不过多的讲解的相关知识点。但是需要配置多个源时,第二个及其以上的就需要单独配置了,这里我使用的都是单独配置的。源码个人日拱一卒,不期速成 简介 MQ 是开发中很平常的中间件,本文讲述的是怎么在一个Spring Boot项目中配置多源的RabbitMQ,这里不过多的讲解RabbitMQ的相关知识点。如果你也有遇到需要...

    paulquei 评论0 收藏0
  • 慕课网_《RabbitMQ消息中间件极速入门与实战》学习总结

    摘要:慕课网消息中间件极速入门与实战学习总结时间年月日星期三说明本文部分内容均来自慕课网。 慕课网《RabbitMQ消息中间件极速入门与实战》学习总结 时间:2018年09月05日星期三 说明:本文部分内容均来自慕课网。@慕课网:https://www.imooc.com 教学源码:无 学习源码:https://github.com/zccodere/s... 第一章:RabbitM...

    mykurisu 评论0 收藏0
  • rabbitmq前言说明

    摘要:源码安装推荐使用的镜像这样也不会污染本地环境基于下载给予你自己使用的权限查找镜像你会看到下载镜像查看自己本地已经下载好的镜像运行镜像查看自己已经运行的镜像说明你可能会遇到如下的因为本机与通信是通信,也就是通过文件通信的 源码:https://github.com/ltoddy/rabbitmq-tutorial Introduction 安装:(推荐使用docker的镜像,这样也不会污...

    Barry_Ng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<