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

RabbitMQ(一)——簡介

.json 文章 不同 ive 守護 運行 發布 密碼 機器學習

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(一)——簡介