AMPQ

歷史

今天聊聊消息隊列
Advanced Message Queuing Protocol (AMQP)
AMQP:前進消息隊列協議
歷史:
消息隊列來源已久煮寡,80年代最早在金融交易中囊扳,高盛等公司采用Teknekron公司的產品,當時的Message queuing軟件叫做:the information bus(TIB)。
 TIB被電信和通訊公司采用炭菌,路透社收購了Teknekron公司。之后杠娱,IBM開發(fā)了MQSeries乏奥,微軟開發(fā)了Microsoft Message Queue(MSMQ)。
這些商業(yè)MQ供應商的問題是廠商鎖定登渣,價格高昂噪服。2001年,Java Message queuing試圖解決鎖定和交互性的問題胜茧,但對應用來說反而更加麻煩了粘优。
于是2004年,摩根大通和iMatrix開始著手Advanced Message Queuing Protocol (AMQP)開放標準的開發(fā)呻顽。
2006年雹顺,AMQP規(guī)范發(fā)布。2007年廊遍,Rabbit技術公司基于AMQP標準開發(fā)的RabbitMQ 1.0 發(fā)布无拗。后來又被spring收購
AMPQ是使用Erlang開發(fā)的,Erlang這哥們主要用來搞游戲與電信方面的東西昧碉,ok英染,下面說說AMPQ又什么用?

應用

RabbitMQ Server:維持roducer到Consumer的路線揽惹,保證數據能夠按照指定的方式進行傳輸。但是這個保證也不是100%的保證

Client A & B:數據的發(fā)送方四康,一個Message有兩個部分:payload(有效載荷)和label(標簽)搪搏,payload顧名思義就是傳輸的數據。label是exchange的名字或者說是一個tag闪金,
它描述了payload疯溺,而且RabbitMQ也是通過這個label來決定把這個Message發(fā)給哪個Consumer。AMQP僅僅描述了label哎垦,而RabbitMQ決定了如何使用這個label的規(guī)則囱嫩。

Client 1,2漏设,3:數據的接收方

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.

 還有幾個概念是上述圖中沒有標明的墨闲,那就是Connection(連接),Channel(通道郑口,頻道)鸳碧。

   Connection: 就是一個TCP的連接。Producer和Consumer都是通過TCP連接到RabbitMQ Server的犬性。以后我們可以看到瞻离,程序的起始處就是建立這個TCP連接。
   Channels: 虛擬連接乒裆。它建立在上述的TCP連接中套利。數據流動都是在Channel中進行的。也就是說鹤耍,一般情況是程序起始建立TCP連接日裙,第二步就是建立這個Channel。
建立和關閉TCP連接是有代價的惰蜜,頻繁的建立關閉TCP連接對于系統的性能有很大的影響,而且TCP的連接數也有限制受神,這也限制了系統處理高并發(fā)的能力

一些說明

  默認情況下抛猖,如果Message 已經被某個Consumer正確的接收到了,那么該Message就會被從queue中移除鼻听。當然也可以讓同一個Message發(fā)送到很多的Consumer财著。
    如果一個queue沒被任何的Consumer Subscribe(訂閱),那么撑碴,如果這個queue有數據到達撑教,那么這個數據會被cache,不會被丟棄醉拓。當有Consumer時伟姐,這個數據會被立即發(fā)送到這個Consumer收苏,這個數據被Consumer正確收到時,這個數據就被從queue中刪除愤兵。
     那么什么是正確收到呢鹿霸?通過ack。每個Message都要被acknowledged(確認秆乳,ack)懦鼠。我們可以顯示的在程序中去ack,也可以自動的ack屹堰。如果有數據沒有被ack肛冶,那么:
     RabbitMQ Server會把這個信息發(fā)送到下一個Consumer。
    如果這個app有bug扯键,忘記了ack睦袖,那么RabbitMQ Server不會再發(fā)送數據給它,因為Server認為這個Consumer處理能力有限忧陪。
   而且ack的機制可以起到限流的作用(Benefitto throttling):在Consumer處理完成數據后發(fā)送ack扣泊,甚至在額外的延時后發(fā)送ack,將有效的balance Consumer的load嘶摊。
   當然對于實際的例子延蟹,比如我們可能會對某些數據進行merge,比如merge 4s內的數據叶堆,然后sleep 4s后再獲取數據阱飘。特別是在監(jiān)聽系統的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预麸。當然也可以創(chuàng)建私有的queue。
這樣只有app本身才可以使用這個queue儒将。queue也可以自動刪除吏祸,被標為auto-delete的queue在最后一個Consumer unsubscribe后就會被自動刪除。那么如果是創(chuàng)建一個已經存在的queue呢钩蚊?
那么不會有任何的影響贡翘。需要注意的是沒有任何的影響蹈矮,也就是說第二次創(chuàng)建如果參數和第一次不一樣,那么該操作雖然成功床估,但是queue的屬性并不會被修改含滴。
    那么誰應該負責創(chuàng)建這個queue呢?是Consumer丐巫,還是Producer谈况?
如果queue不存在,當然Consumer不會得到任何的Message递胧。但是如果queue不存在碑韵,那么Producer Publish的Message會被丟棄。所以缎脾,還是為了數據不丟失祝闻,Consumer和Producer都try to create the queue!反正不管怎么樣遗菠,這個接口都不會出問題联喘。
   queue對load balance的處理是完美的。對于多個Consumer來說辙纬,RabbitMQ 使用循環(huán)的方式(round-robin)的方式均衡的發(fā)送給不同的Consumer豁遭。
4.4 Exchanges   
    從架構圖可以看出,Procuder Publish的Message進入了Exchange贺拣。接著通過“routing keys”蓖谢, RabbitMQ會找到應該把這個Message放到哪個queue里。queue也是通過這個routing keys來做的綁定譬涡。
     有三種類型的Exchanges:direct, fanout,topic闪幽。 每個實現了不同的路由算法(routing algorithm)。
·        Direct exchange: 如果 routing key 匹配, 那么Message就會被傳遞到相應的queue中涡匀。其實在queue創(chuàng)建時盯腌,它會自動的以queue的名字作為routing key來綁定那個exchange。
·        Fanout exchange: 會向響應的queue廣播陨瘩。
·        Topic exchange: 對key進行模式匹配腕够,比如ab*可以傳遞到所有ab*的queue。
4.5 Virtual hosts
   每個virtual host本質上都是一個RabbitMQ Server拾酝,擁有它自己的queue,exchagne卡者,和bings rule等等蒿囤。這保證了你可以在多個不同的application中使用RabbitMQ。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末崇决,一起剝皮案震驚了整個濱河市材诽,隨后出現的幾起案子底挫,更是在濱河造成了極大的恐慌,老刑警劉巖脸侥,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件建邓,死亡現場離奇詭異,居然都是意外死亡睁枕,警方通過查閱死者的電腦和手機官边,發(fā)現死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來外遇,“玉大人注簿,你說我怎么就攤上這事√拢” “怎么了诡渴?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長菲语。 經常有香客問我妄辩,道長,這世上最難降的妖魔是什么山上? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任眼耀,我火速辦了婚禮,結果婚禮上胶哲,老公的妹妹穿的比我還像新娘畔塔。我一直安慰自己,他們只是感情好鸯屿,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布澈吨。 她就那樣靜靜地躺著,像睡著了一般寄摆。 火紅的嫁衣襯著肌膚如雪谅辣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天婶恼,我揣著相機與錄音桑阶,去河邊找鬼。 笑死勾邦,一個胖子當著我的面吹牛蚣录,可吹牛的內容都是我干的。 我是一名探鬼主播眷篇,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼萎河,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起虐杯,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤玛歌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后擎椰,有當地人在樹林里發(fā)現了一具尸體支子,經...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年达舒,在試婚紗的時候發(fā)現自己被綠了值朋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡休弃,死狀恐怖吞歼,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情塔猾,我是刑警寧澤篙骡,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站丈甸,受9級特大地震影響糯俗,放射性物質發(fā)生泄漏。R本人自食惡果不足惜睦擂,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一得湘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧顿仇,春花似錦淘正、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至述呐,卻和暖如春惩淳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乓搬。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工思犁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人进肯。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓激蹲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親江掩。 傳聞我的和親對象是個殘疾皇子学辱,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內容