1. 程式人生 > 其它 >RabbitMQ(一)簡介

RabbitMQ(一)簡介

RabbitMQ(一)——簡介

(原創內容,轉載請註明來源,謝謝)

一、概述

RabbitMQ是一種訊息的傳輸者(broker),除了訊息持久化,不對訊息內容本身做任何的處理。其類似於郵局,可以將郵件傳送給他,也可以去郵局取郵件。RabbitMQ相似,使用者可以將訊息發到其中,也可以去取訊息。

其和ActiveMQ、ZeroMQ、Kafka等功能相似。RabbitMQ具有高穩定性,支援資料持久化,及時執行rabbitmq的伺服器宕機,重啟後訊息仍存在。且有ack回傳機制,保證訊息送達消費者後才會將訊息從佇列中清除。

二、關鍵詞

rabbitmq中有一些關鍵詞,如下:

1、生產者(producer)

生產者是訊息的產生者,即傳送內容供消費者使用。如使用者登入點擊發送簡訊確認,這個點選完傳送之前的過程,就是生產者去實現。

2、消費者(consumer)

消費者即具體任務的處理者,例如上述具體去實現傳送簡訊的過程,就是消費者實現的。消費者要去佇列中取任務,並且執行任務。可以是死迴圈不斷的執行,也可以是定時任務定期去消費。

生產者和消費者是使用者根據實際業務場景去實現的,下面的內容則是rabbitmq通過使用者不同的定義和宣告內部實現的。

3、交換機(exchange)

接收生產者傳送的資訊,其作為第一步,並且將資訊根據使用者的配置,傳送給佇列。

4、佇列(queue)

用於儲存訊息,供消費者來取,並且提供ack機制,消費者取完回饋ack後,會將訊息從佇列刪除。

5、繫結(bind)

交換機和佇列之間的一種機制,當有多個佇列時,通過繫結,交換機會將資訊傳到具體的佇列中。

6、路由鍵(routingkey)

除了繫結,佇列還有一個具體的key,用於標識佇列的身份,當有這個key時,輸錯則交換機不會將資訊傳送到佇列。

7、vhost

類似於資料庫的賬號,一個rabbitmq可以由多個使用者操作,不同的使用者可以用不同的vhost和密碼,用於區分不同使用者的佇列。

8、通道(channel)

通道是使用者和rabbitmq互動的途徑,生產者和交換機、消費者和佇列,都是通過channel進行資料互動。

三、工作模式

rabbitmq有五種工作模式,分別是工作佇列(workqueues)、釋出訂閱(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.pharinstall即可。如果已經有composer.json,則是在require裡面新增這一行內容,然後執行updat命令即可。

2、檔案引用

引入方式也很簡單,如下:

require_once__DIR__ . '/vendor/autoload.php';
usePhpAmqpLibConnectionAMQPStreamConnection;
usePhpAmqpLibMessageAMQPMessage;

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、執行

開啟兩個控制檯,一個執行phpproducer.php,一個執行consumer.php,則consumer.php會收到訊息HelloWorld!。

consumer.php會在後臺一直執行,每次生產者傳送訊息,消費者就會去執行。

因此,為了保證消費者一直在後臺執行,通常要有一個守護程序監視消費者,當其掛掉,則需要重新喚醒。

——written by linhxx 2017.08.19