2019-07-26

RabbitMQ

RabbitMQ是什么

RabbitMQ是一個(gè)消息代理器:它接受和轉(zhuǎn)發(fā)消息。你可以把它當(dāng)作一個(gè)郵局:當(dāng)你把郵件放在信箱里時(shí),你可以肯定郵差先生最終會(huì)把郵件送到你的收件人那里。在這個(gè)比喻中,RabbitMQ就是這里的郵箱,郵局和郵差
隊(duì)列類比一個(gè)郵箱,存在于RabbitMQ, 然而信息流通過(guò)RabbitMQ和您的應(yīng)用程序,他們只能存儲(chǔ)在一個(gè)隊(duì)列。隊(duì)列只受主機(jī)內(nèi)存和磁盤限制的約束,它本質(zhì)上是一個(gè)很大的消息緩沖區(qū)。會(huì)有許多生產(chǎn)者可以發(fā)送到一個(gè)隊(duì)列的消息,許多消費(fèi)者可以嘗試從一個(gè)隊(duì)列接收數(shù)據(jù)

hello world

生產(chǎn)者

image

消費(fèi)者
image

代碼:hello world

work Queues

image

工作隊(duì)列(又名任務(wù)隊(duì)列)背后的主要思想是避免立即執(zhí)行資源密集型任務(wù),必須等待它完成。相反,我們計(jì)劃稍后完成任務(wù)。我們將任務(wù)封裝為消息并將其發(fā)送到隊(duì)列中。后臺(tái)運(yùn)行的一個(gè)工作進(jìn)程將彈出任務(wù)并最終執(zhí)行該任務(wù)。當(dāng)你運(yùn)行許多工人(消費(fèi)者)時(shí),任務(wù)將在他們之間分擔(dān)。

ACK

為了確保消息不會(huì)丟失,RabbitMQ支持消息確認(rèn)。ACK(nowledgement)消費(fèi)者返回的結(jié)果告訴RabbitMQ有一條消息收到,你可以自由可控的刪除他
如果一個(gè)消費(fèi)者中止了(其通道關(guān)閉,連接被關(guān)閉,或TCP連接丟失)不發(fā)送ACK,RabbitMQ將會(huì)理解這個(gè)消息并沒(méi)有完全處理,將它重新加入隊(duì)列。如果有其他用戶同時(shí)在線,它就會(huì)快速地傳遞到另一個(gè)消費(fèi)者。這樣,即使意外中止了,也可以確保沒(méi)有丟失信息。
使用此代碼,我們可以確信,即使在處理消息時(shí)使用Ctrl + C殺死一名消費(fèi)者,也不會(huì)丟失任何東西。消費(fèi)者中止都未確認(rèn)的消息后很快會(huì)被重新分配。

消息持久化

對(duì)已經(jīng)定義的沒(méi)有持久化的隊(duì)列,改變使其持久化,將不起作用,除非重新定義一個(gè)新的隊(duì)列

$msg = new AMQPMessage($data, array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT) );

將消息標(biāo)記為持久性不能完全保證消息不會(huì)丟失。雖然它告訴RabbitMQ保存信息到磁盤上,還有一個(gè)短的時(shí)間窗口時(shí),RabbitMQ 已經(jīng)接受信息并沒(méi)有保存它。另外,RabbitMQ不做磁盤同步每一個(gè)消息--它可能只是保存到緩存并沒(méi)有真正寫入到磁盤。持久性保證不強(qiáng)

公平調(diào)度

image

交換機(jī)

RabbitMQ消息傳遞模型的核心思想是,生產(chǎn)者不發(fā)送任何信息直接到隊(duì)列。事實(shí)上,生產(chǎn)者甚至不知道消息是否會(huì)發(fā)送到任何隊(duì)列。
生產(chǎn)商只能向交換機(jī)(Exchange)發(fā)送消息。交換機(jī)做的事情很簡(jiǎn)單。一方面,它接收來(lái)自生產(chǎn)者的信息,另一邊則推他們排隊(duì)。

image

交換機(jī)的類型:

  • direct
    這種模式會(huì)處理路由鍵,也就是所謂的按需索取。需要將一個(gè)隊(duì)列綁定到exchange上面,要求該消息與一個(gè)特定的路由鍵完全匹配。消息才會(huì)進(jìn)入到該隊(duì)列中。如果一個(gè)隊(duì)列綁定到該交換機(jī)上要求路由鍵 “dog”,則只有被標(biāo)記為“dog”的消息才被轉(zhuǎn)發(fā),不會(huì)轉(zhuǎn)發(fā)dog.puppy,也不會(huì)轉(zhuǎn)發(fā)dog.guard,只會(huì)轉(zhuǎn)發(fā)dog。
    image

    image
  • topic
    這種模式和Direct模式的原理是一樣的,都是根據(jù)路由鍵進(jìn)行消息的路由,但是這種支持路由鍵的模糊匹配,此時(shí)隊(duì)列需要綁定要一個(gè)模式上。符號(hào)“#”匹配一個(gè)或多個(gè)詞,符號(hào)“*”匹配不多不少一個(gè)詞


    image

    image
  • fanout
    交換機(jī)(Exchange)里的消息發(fā)送給所有綁定該交換機(jī)的隊(duì)列,忽略routingKey,相當(dāng)廣播


    image

    image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容