以PHP代碼為實例詳解RabbitMQ消息隊列中間件的6種模式
RabbitMQ 6種工作模式
對RabbitMQ 6種工作模式(簡單模式、工作模式、訂閱模式、路由模式、主題模式、RPC模式)進行場景和參數(shù)進行講解,PHP代碼作為實例。
安裝
客戶端實現(xiàn):添加擴展,執(zhí)行composer.phar install
命令
{ "require": { "php-amqplib/php-amqplib": ">=3.0" } }
引入包
require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPStreamConnection; use PhpAmqpLib\Message\AMQPMessage;
建立一個鏈接,
# 鏈接服務(wù) $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"; # 關(guān)閉信道和鏈接 $channel->close(); $connection->close();
6種模式
1.簡單模式
簡單模式是最簡單的使用方式,P代表生產(chǎn)者,C代表消費者,紅色的代表隊列,執(zhí)行過程生產(chǎn)者發(fā)送消息到隊列,右面的消費者消費消息,需要注意的是這里沒有交換機。
生產(chǎn)者代碼(PHP)
# 聲明隊列 $queueName = 'MqName'; $channel->queue_declare($queueName, false, false, false, false);
queue_declare 參數(shù)說明:
- 隊列名
- 檢測隊列是否存在,true只檢測不創(chuàng)建,false會創(chuàng)建
- 是否持久化隊列,true持久化
- 是否私有隊列 true代表私有
- 當(dāng)消費者斷開后,隊列是否自動刪除
# 創(chuàng)建AMQP消息類型 $msg = new AMQPMessage($data, array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT) );
AMQPMessage 參數(shù)說明: 1.消息體 2.是否持久化
$channel->basic_publish($msg, '', $queueName);
basic_publish參數(shù)詳解:
- 發(fā)送內(nèi)容
- 交換機名稱,簡單模式?jīng)]有使用交換機
- 隊列名稱
消費者代碼:
$channel->basic_consume('hello', '', false, true, false, false, $callback); # 阻塞隊列,做監(jiān)聽 while ($channel->is_open()) { $channel->wait(); }
basic_consume 參數(shù)說明:
- 隊列名
- 消費者標(biāo)簽
- AMQP標(biāo)準(zhǔn)
- 是否自動應(yīng)答 ack true 自動應(yīng)答,false應(yīng)答
- 是否排他
- ?
- 回調(diào)函數(shù)
2.工作模式
它由一個生產(chǎn)者發(fā)送在隊列中,work隊列會分配消息給不同的消費者,讓每個消費者接收到不同的消息。
工作模式的場景特別適合集群模式的異步處理,最大程度發(fā)揮每一臺服務(wù)器的性能。
3.訂閱模式
從訂閱模式開始就使用了交換機,訂閱模式使用了廣播類型的交換機,它會讓每個隊列的消息都是一樣的。
生產(chǎn)者把消息發(fā)送給交換機,交換機把消息發(fā)送給和它綁定的隊列,讓消費者來消費,需要強調(diào)的是綁定的隊列獲得的消息是一模一樣的,訂閱模式就是讓所有的消費者獲得相同的消息。
訂閱模式使用場景,天氣、微博的訂閱,收費文章的訂閱等等。
生產(chǎn)者實現(xiàn):
$channel->exchange_declare('logs', 'fanout', false, false, false); # 綁定交換機和隊列 $channel->queue_bind($queue_name, 'logs');
交換機參數(shù)詳解:
- 交換機名
- 交換機類型
- 檢查是否存在
- 是否持久化
- 是否自動刪除
$channel->basic_publish($msg, '這里是交換機的名字', $queueName);
消費者和生產(chǎn)者一樣,先綁定交換機:
4.路由模式
路由模式使用direct定向類型的交換機,生產(chǎn)者發(fā)送一個消息到交換機,交換機根據(jù)發(fā)送來的路由鍵發(fā)送到相匹配的隊列中,來和隊列綁定的消費者進行消費。
訂閱模式和路由模式的區(qū)別,訂閱模式無條件的把消息發(fā)送給所有的消費者,每一個消費者收到的消息都是一樣的,而路由模式對消息進行篩選發(fā)送給對應(yīng)的消費者隊列。
5.主題模式
主題模式采用的事topic的交換機,通過通配符進行匹配,通配符主要有*
和#
。
6.RPC模式
RabbitMQ的RPC模式,支持生產(chǎn)者和消費者不在同一個系統(tǒng)中,即允許遠程調(diào)用的情況。通常,消費者作為服務(wù)端,放置在遠程的系統(tǒng)中,提供接口,生產(chǎn)者調(diào)用接口,并發(fā)送消息。
RPC模式是一種遠程調(diào)用的模式,因為需要http請求,因此速度比系統(tǒng)內(nèi)部調(diào)用慢。而且rpc模式下,通常不易區(qū)分哪些是來自外部的請求,哪些是內(nèi)部的請求,導(dǎo)致整體速度較慢。因此,不能濫用rpc模式。
最后
后面的3個模式不做詳細(xì)的代碼講解了,可以看參考官網(wǎng),實現(xiàn)起來都是差不多的。
- 官網(wǎng):www.rabbitmq.com/getstarted.…
以上就是以PHP代碼為實例詳解RabbitMQ消息隊列中間件的6種模式的詳細(xì)內(nèi)容,更多關(guān)于RabbitMQ模式php實例的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
CI(CodeIgniter)框架實現(xiàn)圖片上傳的方法
這篇文章主要介紹了CI(CodeIgniter)框架實現(xiàn)圖片上傳的方法,結(jié)合實例形式分析了基于CodeIgniter調(diào)用文件上傳類實現(xiàn)圖片上傳功能的相關(guān)操作技巧,需要的朋友可以參考下2017-03-03PHP中exec函數(shù)和shell_exec函數(shù)的區(qū)別
這篇文章主要介紹了PHP中exec函數(shù)和shell_exec函數(shù)的區(qū)別,這兩個函數(shù)是非常危險的函數(shù),一般情況都是被禁用的,當(dāng)然特殊情況下也會使用,需要的朋友可以參考下2014-08-08ThinkPHP自動完成中使用函數(shù)與回調(diào)方法實例
這篇文章主要介紹了ThinkPHP自動完成中使用函數(shù)與回調(diào)方法,實例分析了ThinkPHP中自動填充的用法以及使用函數(shù)與回調(diào)的方法,是非常實用的技巧,需要的朋友可以參考下2014-11-11Laravel框架基于ajax和layer.js實現(xiàn)無刷新刪除功能示例
這篇文章主要介紹了Laravel框架基于ajax和layer.js實現(xiàn)無刷新刪除功能,結(jié)合實例形式簡單分析了Laravel框架實現(xiàn)的ajax操作數(shù)據(jù)庫相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2019-01-01Laravel 5框架學(xué)習(xí)之環(huán)境與配置
本文給大家主要介紹的是Laravel5框架中的環(huán)境配置,給大家詳細(xì)介紹了.env的配置文件,包含的數(shù)據(jù)庫配置信息的詳細(xì)解釋,這里推薦給大家,有需要的小伙伴參考下。2015-04-04PHP在網(wǎng)頁中動態(tài)生成PDF文件詳細(xì)教程
這篇文章主要介紹了PHP在網(wǎng)頁中動態(tài)生成PDF文件詳細(xì)教程,本文用一個需求為引,詳細(xì)介紹每一步驟的做法,并配有大量圖片說明,需要的朋友可以參考下2014-07-07