以PHP代碼為實例詳解RabbitMQ消息隊列中間件的6種模式
目錄
- RabbitMQ 6種工作模式
- 安裝
- 6種模式
- 最后
RabbitMQ 6種工作模式
對RabbitMQ 6種工作模式(簡單模式、工作模式、訂閱模式、路由模式、主題模式、RPC模式)進行場景和參數進行講解,PHP代碼作為實例。
安裝
客戶端實現:添加擴展,執行composer.phar install
命令
{ "require": {"php-amqplib/php-amqplib": ">=3.0" }}
引入包
require_once __DIR__ . "/vendor/autoload.php";use PhpAmqpLib\Connection\AMQPStreamConnection;use PhpAmqpLib\Message\AMQPMessage;
建立一個鏈接,
# 鏈接服務$connection = new AMQPStreamConnection("127.0.0.1", 5672, "stark", "1990@stark");$channel = $connection->channel();$channel->queue_declare("hello", false, false, false, false);$msg = new AMQPMessage("Hello World!");$channel->basic_publish($msg, "", "hello");echo " [x] Sent "Hello World!"\n";# 關閉信道和鏈接$channel->close();$connection->close();
6種模式
1.簡單模式
簡單模式是最簡單的使用方式,P代表生產者,C代表消費者,紅色的代表隊列,執行過程生產者發送消息到隊列,右面的消費者消費消息,需要注意的是這里沒有交換機。
生產者代碼(PHP)
# 聲明隊列$queueName = "MqName";$channel->queue_declare($queueName, false, false, false, false);
queue_declare 參數說明:
- 隊列名
- 檢測隊列是否存在,true只檢測不創建,false會創建
- 是否持久化隊列,true持久化
- 是否私有隊列 true代表私有
- 當消費者斷開后,隊列是否自動刪除
# 創建AMQP消息類型$msg = new AMQPMessage($data, array("delivery_mode" => AMQPMessage::DELIVERY_MODE_PERSISTENT));
AMQPMessage 參數說明: 1.消息體 2.是否持久化
$channel->basic_publish($msg, "", $queueName);
basic_publish參數詳解:
- 發送內容
- 交換機名稱,簡單模式沒有使用交換機
- 隊列名稱
消費者代碼:
$channel->basic_consume("hello", "", false, true, false, false, $callback);# 阻塞隊列,做監聽while ($channel->is_open()) { $channel->wait();}
basic_consume 參數說明:
- 隊列名
- 消費者標簽
- AMQP標準
- 是否自動應答 ack true 自動應答,false應答
- 是否排他
- ?
- 回調函數
2.工作模式
它由一個生產者發送在隊列中,work隊列會分配消息給不同的消費者,讓每個消費者接收到不同的消息。
工作模式的場景特別適合集群模式的異步處理,最大程度發揮每一臺服務器的性能。
3.訂閱模式
從訂閱模式開始就使用了交換機,訂閱模式使用了廣播類型的交換機,它會讓每個隊列的消息都是一樣的。
生產者把消息發送給交換機,交換機把消息發送給和它綁定的隊列,讓消費者來消費,需要強調的是綁定的隊列獲得的消息是一模一樣的,訂閱模式就是讓所有的消費者獲得相同的消息。
訂閱模式使用場景,天氣、微博的訂閱,收費文章的訂閱等等。
生產者實現:
$channel->exchange_declare("logs", "fanout", false, false, false);# 綁定交換機和隊列$channel->queue_bind($queue_name, "logs");
交換機參數詳解:
- 交換機名
- 交換機類型
- 檢查是否存在
- 是否持久化
- 是否自動刪除
$channel->basic_publish($msg, "這里是交換機的名字", $queueName);
消費者和生產者一樣,先綁定交換機:
4.路由模式
路由模式使用direct定向類型的交換機,生產者發送一個消息到交換機,交換機根據發送來的路由鍵發送到相匹配的隊列中,來和隊列綁定的消費者進行消費。
訂閱模式和路由模式的區別,訂閱模式無條件的把消息發送給所有的消費者,每一個消費者收到的消息都是一樣的,而路由模式對消息進行篩選發送給對應的消費者隊列。
5.主題模式
主題模式采用的事topic的交換機,通過通配符進行匹配,通配符主要有*
和#
。
6.RPC模式
RabbitMQ的RPC模式,支持生產者和消費者不在同一個系統中,即允許遠程調用的情況。通常,消費者作為服務端,放置在遠程的系統中,提供接口,生產者調用接口,并發送消息。
RPC模式是一種遠程調用的模式,因為需要http請求,因此速度比系統內部調用慢。而且rpc模式下,通常不易區分哪些是來自外部的請求,哪些是內部的請求,導致整體速度較慢。因此,不能濫用rpc模式。
最后
后面的3個模式不做詳細的代碼講解了,可以看參考官網,實現起來都是差不多的。
- 官網:www.rabbitmq.com/getstarted.…
以上就是以PHP代碼為實例詳解RabbitMQ消息隊列中間件的6種模式的詳細內容,更多關于RabbitMQ模式php實例的資料請關注其它相關文章!