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