MQ應(yīng)用場景
1. 異步處理
2. 應(yīng)用解耦
3. 流量削峰
秒殺活動,控制參加人數(shù),丟棄超過閾值的請求
RabbitMQ
Broker:消息隊(duì)列服務(wù)器實(shí)體
virtual host:虛擬主機(jī),一個(gè)broker里可以有多個(gè)vhost,用作不同用戶的權(quán)限分離。每一個(gè)vhost本質(zhì)上是一個(gè)mini-rabbitmq server,producer和consumer連接rabbit server需要指定一個(gè)vhost
Channel:消息通道,在客戶端的每個(gè)連接里,可建立多個(gè)channel。創(chuàng)建了客戶端到Broker之間的連接后,客戶端還是不能發(fā)送消息的。需要為每一個(gè)Connection創(chuàng)建Channel,AMQP協(xié)議規(guī)定只有通過Channel才能執(zhí)行AMQP的命令。
Exchange:消息交換機(jī),指定消息路由策略,和Queue一樣,Exchange也可設(shè)置為持久化,臨時(shí)或者自動刪除。Exchange有4種類型:direct(默認(rèn)),fanout,topic和headers:
Queue:消息隊(duì)列,提供了FIFO的處理機(jī)制,具有緩存消息的能力。rabbitmq中,隊(duì)列消息可以設(shè)置為持久化,臨時(shí)或者自動刪除。
設(shè)置為持久化的隊(duì)列,queue中的消息會在server本地硬盤存儲一份,防止系統(tǒng)crash,數(shù)據(jù)丟失 設(shè)置為臨時(shí)隊(duì)列,queue中的數(shù)據(jù)在系統(tǒng)重啟之后就會丟失 設(shè)置為自動刪除的隊(duì)列,當(dāng)不存在用戶連接到server,隊(duì)列中的數(shù)據(jù)會被自動刪除Binding:綁定,把exchange和queue按照路由規(guī)則綁定起來,多對多關(guān)系
Routing Key:路由關(guān)鍵字,exchange根據(jù)這個(gè)關(guān)鍵字進(jìn)行消息投遞
Producer:消息生產(chǎn)者
Consumer:消息消費(fèi)者
通信過程
假設(shè)P1和C1注冊了相同的Broker,Exchange和Queue。P1發(fā)送的消息最終會被C1消費(fèi)?;镜耐ㄐ帕鞒檀蟾湃缦滤荆?/p>P1生產(chǎn)消息,發(fā)送給服務(wù)器端的Exchange Exchange收到消息,根據(jù)ROUTING KEY,將消息轉(zhuǎn)發(fā)給匹配的Queue1 Queue1收到消息,將消息發(fā)送給訂閱者C1 C1收到消息,發(fā)送ACK給隊(duì)列確認(rèn)收到消息 Queue1收到ACK,刪除隊(duì)列中緩存的此條消息
Consumer收到消息時(shí)需要顯式的向rabbit broker發(fā)送basic.ack消息或者consumer訂閱消息時(shí)設(shè)置auto_ack參數(shù)為true。在通信過程中,隊(duì)列對ACK的處理有以下幾種情況:
如果consumer接收了消息,發(fā)送ack,rabbitmq會刪除隊(duì)列中這個(gè)消息,發(fā)送另一條消息給consumer。 如果cosumer接受了消息, 但在發(fā)送ack之前斷開連接,rabbitmq會認(rèn)為這條消息沒有被deliver,在consumer在次連接的時(shí)候,這條消息會被redeliver。 如果consumer接受了消息,但是程序中有bug,忘記了ack,rabbitmq不會重復(fù)發(fā)送消息。 rabbitmq2.0.0和之后的版本支持consumer reject某條(類)消息,可以通過設(shè)置requeue參數(shù)中的reject為true達(dá)到目地,那么rabbitmq將會把消息發(fā)送給下一個(gè)注冊的consumer。