RabbitMQ 筆記

RabbitMQ 是最流行的開(kāi)源消息中間件之一永毅。用于在分布式系統(tǒng)中存儲(chǔ)轉(zhuǎn)發(fā)消息筑悴,在易用性、擴(kuò)展性癞季、高可用性等方面都非常的優(yōu)秀劫瞳。
消息中間件主要用來(lái)解決應(yīng)用的耦合、異步處理和流量削鋒绷柒。

相關(guān)概念

Channel

消息通道志于,在客戶端的每個(gè)連接里,可建立多個(gè) channel 废睦,每個(gè) channel 代表一個(gè)會(huì)話任務(wù)伺绽。

$connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel();

Queue

消息隊(duì)列最終存儲(chǔ)的載體,每個(gè)消息都會(huì)被發(fā)送到一個(gè)或多個(gè)隊(duì)列。
消息實(shí)際上不直接發(fā)送到隊(duì)列憔恳,而是發(fā)送到 Exchange瓤荔,再由 Exchange 決定將消息投放到一個(gè)或多個(gè)隊(duì)列。
如果沒(méi)有指定 Exchange钥组,則會(huì)發(fā)送到 RabbitMQ 默認(rèn)的 Exchange 中(RabbitMQ 安裝后會(huì)帶有不同類型的 Exchange )输硝。
定義隊(duì)列時(shí),如果沒(méi)有指定隊(duì)列名稱程梦,會(huì)自動(dòng)生成隊(duì)列名稱点把。

<?php
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

Exchange

消息交換機(jī)。消息生產(chǎn)者將消息發(fā)送到 exchange屿附,由 exchange 按對(duì)應(yīng)規(guī)則將消息路由到不同消息隊(duì)列郎逃。
發(fā)送消息過(guò)程一般是先定義消息 exchange ,然后發(fā)送消息到 exchange, 如下代碼:

$channel->exchange_declare('exchange_name', $exchange_type, false, false, false);
$channel->basic_publish($msg, $exchange, $routing_key);

不同的 exchange type挺份,消息路由到隊(duì)列的規(guī)則不同褒翰。

fanout 類型

exchange 不會(huì)管 routing_key ,它會(huì)把消息廣播到每個(gè)和它連接的 queue 中匀泊。

direct 類型

exchange 會(huì)檢測(cè)消息中的 routing_key 优训,然后發(fā)送到用相同routing_key 進(jìn)行綁定的 queue 中。
如下圖各聘,如果消息中的routing_key 為 info揣非,則只發(fā)到 gen-Ag1,如果是 error 躲因,則發(fā)到與之綁定的兩個(gè)隊(duì)列早敬。


direct.png

topic 類型

它是 direct 類型的進(jìn)階版。它支持通配符的匹配大脉,可以通過(guò)一個(gè) routing_key 將消息發(fā)送到多個(gè) queue搞监。故通常 routing_key 會(huì)是一個(gè)包含“.”分割多個(gè)單詞。


topic.png

”*”匹配單個(gè)單詞镰矿,”#”匹配多個(gè)單詞腺逛。

headers 類型

exchange 通過(guò)監(jiān)測(cè)消息的頭信息,而不是 routing key 來(lái)決定消息的發(fā)送衡怀。

exchange 其他屬性

持久化
自動(dòng)刪除(沒(méi)有隊(duì)列綁定時(shí)是否自動(dòng)刪除)

Binding

綁定,它的作用是定義 exchange 發(fā)送消息到 queue 的規(guī)則安疗。

$channel->queue_bind($queue_name, $exchange_name, $routing_key);

綁定時(shí)的 routing key 與過(guò)濾器相似抛杨。

Routing Key

路由關(guān)鍵字,exchange 根據(jù)這個(gè)關(guān)鍵字進(jìn)行消息的發(fā)送荐类。

Vhost

虛擬主機(jī)怖现,一個(gè) RabbitMQ 服務(wù)里可以創(chuàng)建多個(gè) vhost ,用作不同用戶的權(quán)限分離。

示例

發(fā)送消息

<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

$connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->exchange_declare('topic_logs', 'topic', false, false, false);

$data = "Hello World!";
$msg = new AMQPMessage($data);

$routing_key = 'app.error';
$channel->basic_publish($msg, 'topic_logs', $routing_key);

echo " [x] Sent ".$routing_key.' : '. $data. "\n";

$channel->close();
$connection->close();

接受消息

<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;

$connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel();

$channel->exchange_declare('topic_logs', 'topic', false, false, false);
list($queue_name, , ) = $channel->queue_declare("", false, false, true, false);
$binding_keys = array(
    'app.error',
    'h5.error',
);
foreach ($binding_keys as $binding_key) {
    $channel->queue_bind($queue_name, 'topic_logs', $binding_key);
}

$callback = function ($msg) {
    echo " [x] ". $msg->delivery_info['routing_key'].":".$msg->body."\n";
};
$consumer = gethostbyname().':'.getmypid();
$channel->basic_consume($queue_name, $consumer, false, true, false, false, $callback);
while (count($channel->callbacks)) {
    $channel->wait();
}

$channel->close();
$connection->close();

其他

  1. 在消費(fèi)消息時(shí)屈嗤,可以將主機(jī)名和進(jìn)程號(hào)作為消費(fèi)者標(biāo)記潘拨,這樣方便后面消費(fèi)異常時(shí)查詢?cè)颉?/li>
  2. 如果生產(chǎn)者沒(méi)有定義 exchange,則實(shí)際是發(fā)送到 RabbitMQ 默認(rèn)的 exchange 中(包含4種不同 exchange type 類型的 exchange )饶号,并且默認(rèn)以發(fā)送的隊(duì)列名稱為對(duì)應(yīng)的 routing key铁追。
  3. 不可以定義名稱相同,而又屬性不同的消息隊(duì)列茫船。
  4. 如果要讓消息持久化琅束,不僅要定義持久化消息隊(duì)列,還要對(duì)消息標(biāo)記持久化算谈。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涩禀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子然眼,更是在濱河造成了極大的恐慌艾船,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件高每,死亡現(xiàn)場(chǎng)離奇詭異屿岂,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)觉义,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門雁社,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人晒骇,你說(shuō)我怎么就攤上這事霉撵。” “怎么了洪囤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵徒坡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瘤缩,道長(zhǎng)喇完,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任剥啤,我火速辦了婚禮锦溪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘府怯。我一直安慰自己刻诊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布牺丙。 她就那樣靜靜地躺著则涯,像睡著了一般复局。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上粟判,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天亿昏,我揣著相機(jī)與錄音,去河邊找鬼档礁。 笑死角钩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的事秀。 我是一名探鬼主播彤断,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼易迹!你這毒婦竟也來(lái)了宰衙?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤睹欲,失蹤者是張志新(化名)和其女友劉穎供炼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體窘疮,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袋哼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闸衫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涛贯。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蔚出,靈堂內(nèi)的尸體忽然破棺而出弟翘,到底是詐尸還是另有隱情,我是刑警寧澤骄酗,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布稀余,位于F島的核電站,受9級(jí)特大地震影響趋翻,放射性物質(zhì)發(fā)生泄漏睛琳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一踏烙、第九天 我趴在偏房一處隱蔽的房頂上張望师骗。 院中可真熱鬧,春花似錦讨惩、人聲如沸辟癌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春靴患,著一層夾襖步出監(jiān)牢的瞬間仍侥,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工鸳君, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留农渊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓或颊,卻偏偏與公主長(zhǎng)得像砸紊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子囱挑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Exchange概念 Exchange:交互機(jī)醉顽,根據(jù)路由鍵轉(zhuǎn)發(fā)消息到綁定的隊(duì)列。 自己說(shuō)說(shuō)Exchange在Rab...
    二月_春風(fēng)閱讀 22,681評(píng)論 1 20
  • 來(lái)源 RabbitMQ是用Erlang實(shí)現(xiàn)的一個(gè)高并發(fā)高可靠AMQP消息隊(duì)列服務(wù)器平挑。支持消息的持久化游添、事務(wù)、擁塞控...
    jiangmo閱讀 10,357評(píng)論 2 34
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理通熄,服務(wù)發(fā)現(xiàn)唆涝,斷路器,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 1. 歷史 RabbitMQ是一個(gè)由erlang開(kāi)發(fā)的AMQP(Advanced Message Queue )的...
    高廣超閱讀 6,096評(píng)論 3 51
  • 什么叫消息隊(duì)列 消息(Message)是指在應(yīng)用間傳送的數(shù)據(jù)唇辨。消息可以非常簡(jiǎn)單廊酣,比如只包含文本字符串,也可以更復(fù)雜...
    lijun_m閱讀 1,343評(píng)論 0 1