1.為什么使用信道(channel)而不使用TCP連接發(fā)送AMQP命令?##
對操作系統(tǒng)來說頻繁的建立和銷毀TCP連接開銷非常昂貴壕曼,而操作系統(tǒng)每秒建立的連接是有上限的苏研,性能瓶頸不可避免,而只建立一條TCP連接無疑是一個很好的方案腮郊,在這條連接當(dāng)中建立多條信道與RabbitMQ進(jìn)行私密通信摹蘑,相當(dāng)于光纖電纜一樣,一條電纜有多條光束轧飞,信道是沒有限制的
2.隊(duì)列##
1衅鹿、AMQP的命令
basic.consume與basic.get 如果需要消息一到達(dá)隊(duì)列就自動接收的話,應(yīng)該使用basic.consume basic.get會訂閱消息过咬,獲得單條消息塘安,然后取消訂閱,值得注意的是不應(yīng)該循環(huán)basic.get來替代basic.consume援奢,應(yīng)該理性使用basic.consume實(shí)現(xiàn)高吞吐量
消息如果到達(dá)無人訂閱的隊(duì)列,消息會在隊(duì)列中等待忍捡,知道有消費(fèi)者訂閱到該隊(duì)列
2集漾、接收消息
消費(fèi)者確認(rèn)消息告訴RabbitMQ已正確接收RabbitMQ會安全的把消息從隊(duì)列上刪除切黔, 如果消費(fèi)者收到一條消息,確認(rèn)之前RabbitMQ斷開了連接(或者從隊(duì)列上取消訂閱)具篇,RabbitMQ會認(rèn)為這條消息沒有被分發(fā)纬霞,然后分發(fā)給下一個訂閱者。如果應(yīng)用程序處理消息耗時驱显,則可以延遲確認(rèn)消息诗芜,防止源源不斷的消息涌入
** 3、拒絕接收 消息未確認(rèn)之前 **
a.消費(fèi)者從RabbitMQ服務(wù)器斷開連接埃疫,它會將消息入隊(duì)并發(fā)送給下一個消費(fèi)者伏恐,但是這種連接/斷開方式會增加服務(wù)器負(fù)擔(dān)
b.可以使用basic.reject命令拒絕接收消息,參數(shù)為true栓霜,會發(fā)送給下一個消費(fèi)者翠桦,false時,會把消息從隊(duì)列中移除不會分發(fā)給下一個消費(fèi)者
** 4胳蛮、隊(duì)列設(shè)置 **
如果想擁有私人隊(duì)列只為一個消費(fèi)者服務(wù)销凑,可以設(shè)置exclusive參數(shù)為true 如果需要臨時隊(duì)列和結(jié)合exclusive和auto_delete,auto_delete在消費(fèi)者取消訂閱時仅炊,會自動刪除斗幼,都設(shè)置為true
** 3.三種基本交換類型 **
- direct交換器非常簡單:如果路由鍵匹配的話,消息就會被投遞到相應(yīng)的隊(duì)列當(dāng)中抚垄;
- fanout交換器會將收到的消息廣播到綁定的隊(duì)列上蜕窿;
- topic交換器使得來自不同源頭的消息能夠到達(dá)同一個隊(duì)列。
** 4.虛擬主機(jī)(vhost)的作用**
- 邏輯分離允許為不同應(yīng)用程序安全保密的運(yùn)行數(shù)據(jù)督勺,將rabbit的眾多客戶區(qū)分開來渠羞,避免隊(duì)列和交換器的命名沖突;
- 權(quán)限控制以vhost為單位智哀;
- vhost之間是絕對隔離的次询,無法將vhost1上的交換器綁定到vhost2中的隊(duì)列去;
- 可以安全的遷移到新的RabbitMQ服務(wù)器上處理新的負(fù)載瓷叫,不會有任何命名沖突
- vhost不僅消除了在基礎(chǔ)架構(gòu)中為每一層都運(yùn)行一個RabbitMQ服務(wù)器屯吊,也避免了為每一層創(chuàng)建不同集群
** 5.持久化的策略**
durable屬性決定了RabbitMQ是否需要在崩潰或者重啟之后重新創(chuàng)建隊(duì)列(或者交換器) 持久化消息三個要點(diǎn): 把他的投遞模式(delivery mode)選項(xiàng)設(shè)置為2(持久); 發(fā)送到持久化的交換器上摹菠; 到達(dá)持久化的隊(duì)列盒卸。 特點(diǎn): 持久性消息從服務(wù)器重啟中恢復(fù)的方式是寫入磁盤的持久化日志文件,當(dāng)發(fā)布一條持久性消息到持久化的交換器上時次氨,消息提交到日志文件后才會響應(yīng)蔽介;
持久性消息如果路由到了非持久化的隊(duì)列當(dāng)中,會自動從持久性日志中移除,無法從服務(wù)器重啟中恢復(fù)虹蓄;一旦被正確消費(fèi)(經(jīng)過確認(rèn)后)犀呼,RabbitMQ會在持久化日志中將這條消息標(biāo)記為等待垃圾收集。在消費(fèi)之前薇组,如果重啟外臂,服務(wù)器會重建交換器和隊(duì)列以及綁定,重播持久性日志文件中的消息到合適的隊(duì)列或者交換器上律胀,這取決與宕機(jī)時消息處在哪個環(huán)節(jié)上
** 6.解決事務(wù)的方案:發(fā)送方確認(rèn)模式**
由于AMQP內(nèi)部事務(wù)對性能有很大瓶頸宋光,現(xiàn)采取發(fā)送方確認(rèn)模式保證事務(wù),將信道設(shè)置為confirm模式炭菌,所有在此信道上發(fā)布的消息都會有一個唯一的ID號罪佳,當(dāng)被投遞到匹配的隊(duì)列時,信道就會發(fā)送一個發(fā)送方確認(rèn)模式給生產(chǎn)者應(yīng)用程序娃兽,這個模式是異步的菇民,應(yīng)用程序可以等待確認(rèn)的同時繼續(xù)發(fā)送下一條,但如果是持久化的消息投储,會在寫入磁盤之后消息發(fā)出第练。
如果發(fā)送內(nèi)部錯誤而導(dǎo)致消息丟失,RabbitMQ會發(fā)送一條nack(not acknowledged,未確認(rèn))消息玛荞,這種模式下每分鐘可追蹤數(shù)以百萬計的消息投遞
** 7娇掏、性能特點(diǎn) **
- 可靠性(Reliability) RabbitMQ提供很多特性供我們可以在性能和可靠性作出折中的選擇,包括持久化勋眯、發(fā)送確認(rèn)婴梧、發(fā)布者確認(rèn)和高可用性等。
- 彈性選路(Flexible Routing) 消息在到達(dá)隊(duì)列前通過交換(exchanges)來被選路客蹋。RabbitMQ為典型的選路邏輯設(shè)計了幾個內(nèi)置的交換類型塞蹭。對于更加復(fù)雜的選路,我們可以將exchanges綁定在一起或者寫屬于自己的exchange類型插件讶坯。
- 集群化(Clustering) 在一個局域網(wǎng)內(nèi)的幾個RabbitMQ服務(wù)器可以集群起來番电,組成一個邏輯的代理人。
- 聯(lián)盟(Federation) 對于那些需要比集群更加松散和非可靠連接的服務(wù)器來說辆琅,RabbitMQ提供一個聯(lián)盟模型(Federation Model)
- 高可用隊(duì)列(High Available Queue) 可以在一個集群里的幾個機(jī)器里對隊(duì)列做鏡像漱办,確保即時發(fā)生了硬件失效,你的消息也是安全的婉烟。
- 多種協(xié)議(Multi-protocol) RabbitMQ支持消息在多種協(xié)議中傳輸娩井。
- 多客戶端(Many Clients) RabbitMQ客戶端有你幾乎能想象到的任何語言。
- 管理界面(Management UI) RabbitMQ附帶一個容易使用的管理界面,允許您監(jiān)控和控制你的消息broker服務(wù)器的方方面面似袁。
- 跟蹤(Tracing) 如果你的消息系統(tǒng)行為異常洞辣,RabbitMQ提供跟蹤支持來找出錯誤的根源咐刨。
- 插件系統(tǒng)(Plugin System) RabbitMQ提供各種方式的插件擴(kuò)展,我們可以實(shí)現(xiàn)自己的插件屋彪。
使用任務(wù)隊(duì)列一個優(yōu)點(diǎn)是能夠輕易地并行處理任務(wù)所宰。當(dāng)處理大量積壓的任務(wù),只要增加工作隊(duì)列畜挥,通過這個方式,能夠?qū)崿F(xiàn)輕易的縮放婴谱。