天天看點

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