RabbitMQ 是什麼

  1. RabbitMQ 是一套訊息佇列 message queue/broker 工具
  2. 通常用於大量資料傳輸,不會/能馬上被消化的,暫時存放的一個地方
  3. 像是電子商務的訂單系統,用於應付大量的訂購資連線,不致於網站一直掛掉

這邊不提及它的架構,只來看怎麼安裝、傳送、接收

而且不讓網站掛掉,RabbitMQ 也只是其中一個解決方案,不是用了就萬能不掛的

RabbitMQ 怎麼安裝

yum -y install epel-release
yum -y install rabbitmq-server

啟動

systemctl start rabbitmq-server
systemctl enable rabbitmq-server

安裝管理介面 (後 restart rabbitmq-server)

rabbitmq-plugins enable rabbitmq_management

建立使用者

rabbitmqctl add_user admin 123456

給最高權限

rabbitmqctl set_user_tags admin administrator

權限可以修改、寫入、讀取

rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

刪除預設的使用者 guest

rabbitmqctl delete_user guest

查看現有使用者

rabbitmqctl list_users

用 admin/123456 登入 (可看統計資料、與管理)

http://1.1.1.1:15672/

查看 queue

rabbitmqctl list_queues

(以上也可以直接 docker ↓)

RabbitMQ 也可以使用 docker 安裝

docker run --name rabbitmq -d -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123456 rabbitmq:management

 

RabbitMQ 怎麼使用

寫兩支 PHP 程式,一支是 sender.php (Producer) 負責傳送 (送到 RabbitMQ 裡),一支 receiver.php (Consumer (Worker)) 負責接收 (從 RabbitMQ 裡抓出來)

這邊的接收 receiver.php 並不是說用 sender.php 打資料到 receiver.php ,而是 sender.php 送 1 給 RabbitMQ 後, receiver.php 從 RabbitMQ 裡抓出取得到 1,然後 RabbitMQ 裡就看不到 1 了

參考 https://www.rabbitmq.com/getstarted.html

先安裝 php

yum install php php-bcmath -y

安裝 RabbitMQ php library

curl -sS https://getcomposer.org/installer | php -d allow_url_fopen=on
mv composer.phar /usr/local/bin/composer
composer require php-amqplib/php-amqplib

vi sender.php

<?php 
require_once __DIR__ . '/vendor/autoload.php'; 
use PhpAmqpLib\Connection\AMQPStreamConnection; 
use PhpAmqpLib\Message\AMQPMessage; 

$connection = new AMQPStreamConnection('localhost', 5672, 'admin', '123456'); 
$channel = $connection->channel();

$data = implode(' ', array_slice($argv, 1));

if (! $data)
{
    echo $argv[0] . " 'message'\n";
    exit;
}

$channel->queue_declare('data', false, false, false, false);

$msg = new AMQPMessage($data);
$channel->basic_publish($msg, '', 'data');

echo " [x] Sent $data\n";

$channel->close();
$connection->close();

vi receiver.php

<?php 
require_once __DIR__ . '/vendor/autoload.php'; 
use PhpAmqpLib\Connection\AMQPStreamConnection; 

$connection = new AMQPStreamConnection('localhost', 5672, 'admin', '123456'); 
$channel = $connection->channel();

$channel->queue_declare('data', false, false, false, false);

echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";

$callback = function($msg) {
    echo " [x] Received ", $msg->body, "\n";
};

$channel->basic_consume('data', '', false, true, false, false, $callback);

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

$channel->close();
$connection->close();

執行送資料 (php 後面接的就是資料值)

php sender.php "$(date +%F.%T)"

執行取資料

php receiver.php

 

最後修改日期: 2021 年 11 月 08 日

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。