天天看点

RabbitMQ 入门指南(一)

简介

RabbitMQ 是消息中间件,它主要负责接收、存储和转发(发送)消息。

默认端口为 5672。

消息指的是二进制的数据。

你可以把 RabbitMQ 看作是一个邮局,它包含信箱、邮递员。

我们以 PHP 语言为例,来讲解如何使用 RabbitMQ。

准备工作

环境要求

  • PHP 的版本 >= 5.6
  • PHP 的 bcmath 扩展(Windows 内置支持,Linux 需手动安装)
  • PHP 的 sockets 扩展(Windows 直接开启,Linux 需手动安装)

安装 php-amqplib

使用 PHP 语言作为客户端来操作 RabbitMQ,需要先在我们的应用(application)中安装 php-amqplib API。

# 推荐使用 composer 来安装
composer require php-amqplib/php-amqplib
或
composer require php-amqplib/php-amqplib:2.10.0
           

最简单的示例 Hello World

我们来实现一个最简单的消息发送和接收的例子。

RabbitMQ 入门指南(一)

首先,在应用(application) 目录中,创建 send.php 文件,作为消息的 Producer。

<?php

// php 的依赖包自动加载,引入相关的类
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

// 连接到指定的 RabbitMQ 服务器(Broker),并创建 channel
$connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel();

// 声明队列(queue)
// queue_declare() 方法是幂等的,即只有当指定的 queue 不存在时才会创建
$channel->queue_declare('hello', false, false, false, false);

// 创建消息
$msg = new AMQPMessage('Hello World!');

// 将消息发送到指定的队列
$channel->basic_publish($msg, '', 'hello');

// 消息发送成功后,输出提示信息
echo " [x] Sent 'Hello World!'\n";

// 最后,关闭 channel 和 connection
$channel->close();
$connection->close();
           

这里,我们以 PHP CLI 的方式,发送消息。

php send.php
           

其次,创建 receive.php 文件,作为消息的 Consumer。

<?php

// php 的依赖包自动加载,引入相关的类
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;

// 连接到指定的 RabbitMQ 服务器(Broker),并创建 channel
$connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel();

// 声明要监听的队列(queue)
$channel->queue_declare('hello', false, false, false, false);

// 提示信息
echo " [*] Waiting for messages. To exit press CTRL+C\n";

// 回调函数
$callback = function ($msg) {
    // todo 处理消息的业务逻辑
    echo ' [x] Received ', $msg->body, "\n";
};

// 启动消费者
$channel->basic_consume('hello', '', false, true, false, false, $callback);

while ($channel->is_consuming()) { // 如果正在进行回调处理
    $channel->wait(); // 等待
}

// 最后,关闭 channel 和 connection
$channel->close();
$connection->close();
           

运行 Consumer

php receive.php
           

说明: Producer 发送完一条消息后就会关闭退出,而 Consumer 可以一直运行,以便监听 RabbitMQ 的 Queue 中的消息,并随时进行处理。

查看消息列表

想要查看 RabbitMQ 的队列中,有多少条消息,可以使用下面的方式。

# Linux 中,已授权的用户
sudo rabbitmqctl list_queues

# Windows 中,D:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.17\sbin 目录下
rabbitmqctl list_queues
           

输出结果如下:

Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name    messages
hello   2
           

当然,也可以使用 RabbitMQ 的可视化 Web 管理界面。

http://127.0.0.1:15672/#/queues
           

参考文献

[1] https://www.rabbitmq.com/tutorials/tutorial-one-php.html