RabbitMQ(一)——簡介
RabbitMQ(一)
——簡介
(轉載請附上本文鏈接——linhxx)
一、概述
RabbitMQ是一種消息的傳輸者(broker),除了消息持久化,不對消息內容本身做任何的處理。其類似於郵局,可以將郵件發送給他,也可以去郵局取郵件。RabbitMQ相似,用戶可以將消息發到其中,也可以去取消息。
其和ActiveMQ、ZeroMQ、Kafka等功能相似。RabbitMQ具有高穩定性,支持數據持久化,及時運行rabbitmq的服務器宕機,重啟後消息仍存在。且有ack回傳機制,保證消息送達消費者後才會將消息從隊列中清除。
二、關鍵詞
rabbitmq中有一些關鍵詞,如下:
1、生產者(producer)
生產者是消息的產生者,即發送內容供消費者使用。如用戶登錄點擊發送短信確認,這個點擊完發送之前的過程,就是生產者去實現。
2、消費者(consumer)
消費者即具體任務的處理者,例如上述具體去實現發送短信的過程,就是消費者實現的。消費者要去隊列中取任務,並且執行任務。可以是死循環不斷的運行,也可以是定時任務定期去消費。
生產者和消費者是用戶根據實際業務場景去實現的,下面的內容則是rabbitmq通過用戶不同的定義和聲明內部實現的。
3、交換機(exchange)
接收生產者發送的信息,其作為第一步,並且將信息根據用戶的配置,發送給隊列。
4、隊列(queue)
用於存儲消息,供消費者來取,並且提供ack機制,消費者取完回饋ack後,會將消息從隊列刪除。
5、綁定(bind)
交換機和隊列之間的一種機制,當有多個隊列時,通過綁定,交換機會將信息傳到具體的隊列中。
6、路由鍵(routing key)
除了綁定,隊列還有一個具體的key,用於標識隊列的身份,當有這個key時,輸錯則交換機不會將信息發送到隊列。
7、vhost
類似於數據庫的賬號,一個rabbitmq可以由多個用戶操作,不同的用戶可以用不同的vhost和密碼,用於區分不同用戶的隊列。
8、通道(channel)
通道是用戶和rabbitmq交互的途徑,生產者和交換機、消費者和隊列,都是通過channel進行數據交互。
三、工作模式
rabbitmq有五種工作模式,分別是工作隊列(work queues)、發布訂閱(publish/subscribe)、路由(routing)、主題(topic)、遠程調用(rpc),每種模式都有不同的特性。如下圖所示:
1、工作隊列
2、發布訂閱
3、路由
4、主題
5、遠程
四、使用方式
1、安裝
rabbitmq支持非常多種編程語言,這裏用php來進行操作。php安裝rabbit,建議采用composer的方式,即在項目創建一個composer.json文件,並寫入:
{
"require": {
"php-amqplib/php-amqplib": ">=2.6.1"
}
}
在命令行中運行composer.phar install即可。如果已經有composer.json,則是在require裏面添加這一行內容,然後運行updat命令即可。
2、文件引用
引入方式也很簡單,如下:
require_once __DIR__ . ‘/vendor/autoload.php‘;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
3、創建連接和channel
$connection = new AMQPStreamConnection(‘localhost‘, 5672, ‘guest‘, ‘guest‘);
$channel = $connection->channel();
4、關閉連接
每次執行完後,生產者和消費者都需要關閉連接,如下:
$channel->close();
$connection->close();
5、生產者
假設文件名為producer.php
發送一段最基礎的內容給消費者,比較簡單,因為exchange可以采用默認的,因此甚至可以不用定義exchange,直接定義隊列即可。
生產者較簡單,定義隊列、定義消息、發送消息即可。其中,AMQPMessage傳入的內容即具體的業務邏輯,如果是數組或者對象還需要序列化後進行傳輸。
$channel->queue_declare(‘hello‘, false, false, false, false);
$msg = new AMQPMessage(‘Hello World!‘);
$channel->basic_publish($msg, ‘‘, ‘hello‘);
6、消費者
假設文件名為consumer.php
去隊列中獲取消息,並進行後續的處理工作。如果有開啟ack機制,還需要在處理完任務後,給隊列進行回饋。
消費者需要定義較多內容,包括定義隊列、定義回調函數、定義消費方法、while循環中等待生產者發送消息並進行處理。
其中,回調函數即具體的業務邏輯。
$channel->queue_declare(‘hello‘, false, false, false, false);
$callback = function($msg) {
echo " [x] Received ", $msg->body, "\n";
};
$channel->basic_consume(‘hello‘, ‘‘, false, true, false, false, $callback);
while(count($channel->callbacks)) {
$channel->wait();
}
7、運行
打開兩個控制臺,一個運行php producer.php,一個運行consumer.php,則consumer.php會收到消息Hello World!。
consumer.php會在後臺一直運行,每次生產者發送消息,消費者就會去執行。
因此,為了保證消費者一直在後臺運行,通常要有一個守護進程監視消費者,當其掛掉,則需要重新喚醒。
——written by linhxx
更多最新文章,歡迎關註微信公眾號“決勝機器學習”,或掃描右邊二維碼。
RabbitMQ(一)——簡介