溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

RabbitMQ消息隊列有什么用

發(fā)布時間:2021-12-24 09:15:47 來源:億速云 閱讀:114 作者:小新 欄目:云計算

這篇文章主要介紹了RabbitMQ消息隊列有什么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

1. 歷史

    RabbitMQ是一個由erlang開發(fā)的AMQP(Advanced Message Queue )的開源實現(xiàn)。AMQP 的出現(xiàn)其實也是應(yīng)了廣大人民群眾的需求,雖然在同步消息通訊的世界里有很多公開標(biāo)準(zhǔn)(如 COBAR的 IIOP ,或者是 SOAP 等),但是在異步消息處理中卻不是這樣,只有大企業(yè)有一些商業(yè)實現(xiàn)(如微軟的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco 、Redhat、iMatix 等聯(lián)合制定了 AMQP 的公開標(biāo)準(zhǔn)。

    RabbitMQ是由RabbitMQ  Technologies Ltd開發(fā)并且提供商業(yè)支持的。該公司在2010年4月被SpringSource(VMWare的一個部門)收購。在2013年5月被并入Pivotal。其實VMWare,Pivotal和EMC本質(zhì)上是一家的。不同的是VMWare是獨立上市子公司,而Pivotal是整合了EMC的某些資源,現(xiàn)在并沒有上市。

2. 應(yīng)用場景  

     言歸正傳。RabbitMQ,或者說AMQP解決了什么問題,或者說它的應(yīng)用場景是什么?

     對于一個大型的軟件系統(tǒng)來說,它會有很多的組件或者說模塊或者說子系統(tǒng)或者(subsystem or Component or submodule)。那么這些模塊的如何通信?這和傳統(tǒng)的IPC有很大的區(qū)別。傳統(tǒng)的IPC很多都是在單一系統(tǒng)上的,模塊耦合性很大,不適合擴展(Scalability);如果使用socket那么不同的模塊的確可以部署到不同的機器上,但是還是有很多問題需要解決。比如:

 1)信息的發(fā)送者和接收者如何維持這個連接,如果一方的連接中斷,這期間的數(shù)據(jù)如何方式丟失?

 2)如何降低發(fā)送者和接收者的耦合度?

 3)如何讓Priority高的接收者先接到數(shù)據(jù)?

 4)如何做到load balance?有效均衡接收者的負(fù)載?

 5)如何有效的將數(shù)據(jù)發(fā)送到相關(guān)的接收者?也就是說將接收者subscribe 不同的數(shù)據(jù),如何做有效的filter。

 6)如何做到可擴展,甚至將這個通信模塊發(fā)到cluster上?

 7)如何保證接收者接收到了完整,正確的數(shù)據(jù)?

  AMDQ協(xié)議解決了以上的問題,而RabbitMQ實現(xiàn)了AMQP。

3. 系統(tǒng)架構(gòu)

      成為系統(tǒng)架構(gòu)可能不太合適,可能叫應(yīng)用場景的系統(tǒng)架構(gòu)更合適。

  RabbitMQ消息隊列有什么用

    這個系統(tǒng)架構(gòu)圖版權(quán)屬于sunjun041640。

    RabbitMQ Server: 也叫broker server,它不是運送食物的卡車,而是一種傳輸服務(wù)。原話是RabbitMQisn’t a food truck, it’s a delivery service. 他的角色就是維護一條從Producer到Consumer的路線,保證數(shù)據(jù)能夠按照指定的方式進行傳輸。但是這個保證也不是100%的保證,但是對于普通的應(yīng)用來說這已經(jīng)足夠了。當(dāng)然對于商業(yè)系統(tǒng)來說,可以再做一層數(shù)據(jù)一致性的guard,就可以徹底保證系統(tǒng)的一致性了。

    Client A & B: 也叫Producer,數(shù)據(jù)的發(fā)送方。createmessages and publish (send) them to a broker server (RabbitMQ).一個Message有兩個部分:payload(有效載荷)和label(標(biāo)簽)。payload顧名思義就是傳輸?shù)臄?shù)據(jù)。label是exchange的名字或者說是一個tag,它描述了payload,而且RabbitMQ也是通過這個label來決定把這個Message發(fā)給哪個Consumer。AMQP僅僅描述了label,而RabbitMQ決定了如何使用這個label的規(guī)則。

    Client 1,2,3:也叫Consumer,數(shù)據(jù)的接收方。Consumersattach to a broker server (RabbitMQ) and subscribe to a queue。把queue比作是一個有名字的郵箱。當(dāng)有Message到達(dá)某個郵箱后,RabbitMQ把它發(fā)送給它的某個訂閱者即Consumer。當(dāng)然可能會把同一個Message發(fā)送給很多的Consumer。在這個Message中,只有payload,label已經(jīng)被刪掉了。對于Consumer來說,它是不知道誰發(fā)送的這個信息的。就是協(xié)議本身不支持。但是當(dāng)然了如果Producer發(fā)送的payload包含了Producer的信息就另當(dāng)別論了。

     對于一個數(shù)據(jù)從Producer到Consumer的正確傳遞,還有三個概念需要明確:exchanges, queues and bindings。

        Exchanges are where producers publish their messages.

        Queuesare where the messages end up and are received by consumers

        Bindings are how the messages get routed from the exchange to particular queues.

   還有幾個概念是上述圖中沒有標(biāo)明的,那就是Connection(連接),Channel(通道,頻道)。

   Connection: 就是一個TCP的連接。Producer和Consumer都是通過TCP連接到RabbitMQ Server的。以后我們可以看到,程序的起始處就是建立這個TCP連接。

   Channels: 虛擬連接。它建立在上述的TCP連接中。數(shù)據(jù)流動都是在Channel中進行的。也就是說,一般情況是程序起始建立TCP連接,第二步就是建立這個Channel。

    那么,為什么使用Channel,而不是直接使用TCP連接?

    對于OS來說,建立和關(guān)閉TCP連接是有代價的,頻繁的建立關(guān)閉TCP連接對于系統(tǒng)的性能有很大的影響,而且TCP的連接數(shù)也有限制,這也限制了系統(tǒng)處理高并發(fā)的能力。但是,在TCP連接中建立Channel是沒有上述代價的。對于Producer或者Consumer來說,可以并發(fā)的使用多個Channel進行Publish或者Receive。有實驗表明,1s的數(shù)據(jù)可以Publish20K的數(shù)據(jù)包。當(dāng)然對于不同的硬件環(huán)境,不同的數(shù)據(jù)包大小這個數(shù)據(jù)肯定不一樣,但是我只想說明,對于普通的Consumer或者Producer來說,這已經(jīng)足夠了。如果不夠用,你考慮的應(yīng)該是如何細(xì)化split你的設(shè)計。

4. 進一步的細(xì)節(jié)闡明

4.1 使用ack確認(rèn)Message的正確傳遞

   默認(rèn)情況下,如果Message 已經(jīng)被某個Consumer正確的接收到了,那么該Message就會被從queue中移除。當(dāng)然也可以讓同一個Message發(fā)送到很多的Consumer。

    如果一個queue沒被任何的Consumer Subscribe(訂閱),那么,如果這個queue有數(shù)據(jù)到達(dá),那么這個數(shù)據(jù)會被cache,不會被丟棄。當(dāng)有Consumer時,這個數(shù)據(jù)會被立即發(fā)送到這個Consumer,這個數(shù)據(jù)被Consumer正確收到時,這個數(shù)據(jù)就被從queue中刪除。

     那么什么是正確收到呢?通過ack。每個Message都要被acknowledged(確認(rèn),ack)。我們可以顯示的在程序中去ack,也可以自動的ack。如果有數(shù)據(jù)沒有被ack,那么:

     RabbitMQ Server會把這個信息發(fā)送到下一個Consumer。

    如果這個app有bug,忘記了ack,那么RabbitMQ Server不會再發(fā)送數(shù)據(jù)給它,因為Server認(rèn)為這個Consumer處理能力有限。

   而且ack的機制可以起到限流的作用(Benefitto throttling):在Consumer處理完成數(shù)據(jù)后發(fā)送ack,甚至在額外的延時后發(fā)送ack,將有效的balance Consumer的load。

   當(dāng)然對于實際的例子,比如我們可能會對某些數(shù)據(jù)進行merge,比如merge 4s內(nèi)的數(shù)據(jù),然后sleep 4s后再獲取數(shù)據(jù)。特別是在監(jiān)聽系統(tǒng)的state,我們不希望所有的state實時的傳遞上去,而是希望有一定的延時。這樣可以減少某些IO,而且終端用戶也不會感覺到。

4.2 Reject a message

   有兩種方式,第一種的Reject可以讓RabbitMQ Server將該Message 發(fā)送到下一個Consumer。第二種是從queue中立即刪除該Message。

4.3  Creating a queue

      Consumer和Procuder都可以通過 queue.declare 創(chuàng)建queue。對于某個Channel來說,Consumer不能declare一個queue,卻訂閱其他的queue。當(dāng)然也可以創(chuàng)建私有的queue。這樣只有app本身才可以使用這個queue。queue也可以自動刪除,被標(biāo)為auto-delete的queue在最后一個Consumer unsubscribe后就會被自動刪除。那么如果是創(chuàng)建一個已經(jīng)存在的queue呢?那么不會有任何的影響。需要注意的是沒有任何的影響,也就是說第二次創(chuàng)建如果參數(shù)和第一次不一樣,那么該操作雖然成功,但是queue的屬性并不會被修改。

    那么誰應(yīng)該負(fù)責(zé)創(chuàng)建這個queue呢?是Consumer,還是Producer?

如果queue不存在,當(dāng)然Consumer不會得到任何的Message。但是如果queue不存在,那么Producer Publish的Message會被丟棄。所以,還是為了數(shù)據(jù)不丟失,Consumer和Producer都try to create the queue!反正不管怎么樣,這個接口都不會出問題。

   queue對load balance的處理是完美的。對于多個Consumer來說,RabbitMQ 使用循環(huán)的方式(round-robin)的方式均衡的發(fā)送給不同的Consumer。

4.4 Exchanges  

    從架構(gòu)圖可以看出,Procuder Publish的Message進入了Exchange。接著通過“routing keys”, RabbitMQ會找到應(yīng)該把這個Message放到哪個queue里。queue也是通過這個routing keys來做的綁定。

     有三種類型的Exchanges:direct, fanout,topic。 每個實現(xiàn)了不同的路由算法(routing algorithm)。

·        Direct exchange: 如果 routing key 匹配, 那么Message就會被傳遞到相應(yīng)的queue中。其實在queue創(chuàng)建時,它會自動的以queue的名字作為routing key來綁定那個exchange。

·        Fanout exchange: 會向響應(yīng)的queue廣播。

·        Topic exchange: 對key進行模式匹配,比如ab*可以傳遞到所有ab*的queue。

4.5 Virtual hosts

   每個virtual host本質(zhì)上都是一個RabbitMQ Server,擁有它自己的queue,exchagne,和bings rule等等。這保證了你可以在多個不同的application中使用RabbitMQ。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“RabbitMQ消息隊列有什么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI