一尽楔、簡(jiǎn)介
? ? ? ? 介紹RabbitMQ首先需要知道MQ是什么,MQ是 message queue 的簡(jiǎn)稱,是應(yīng)用程序和應(yīng)用程序之間通信的方法客蹋。
? ??????RabbitMQ是一個(gè)由erlang語(yǔ)言編寫的、開源的孽江、在AMQP基礎(chǔ)上完整的岗屏、可復(fù)用的企業(yè)消息系統(tǒng)辆琅。支持多種語(yǔ)言,包括java、Python仔粥、ruby谭羔、PHP、C/C++等麦向。
? ??????AMQP:advanced message queuing protocol 话告,一個(gè)提供統(tǒng)一消息服務(wù)的應(yīng)用層標(biāo)準(zhǔn)高級(jí)消息隊(duì)列協(xié)議,是應(yīng)用層協(xié)議的一個(gè)開放標(biāo)準(zhǔn)卵慰,為面向消息的中間件設(shè)計(jì)沙郭。基于此協(xié)議的客戶端與消息中間件可傳遞消息并不受客戶端/中間件不同產(chǎn)品裳朋、不同開發(fā)語(yǔ)言等條件的限制病线。
二、RabbitMQ五種消息發(fā)送模式
? ??????RabbitMQ包括五種隊(duì)列模式鲤嫡,簡(jiǎn)單隊(duì)列送挑、工作隊(duì)列、發(fā)布/訂閱暖眼、路由惕耕、主題、rpc等诫肠。
1司澎、簡(jiǎn)單隊(duì)列
? ? ? ? 1、生產(chǎn)者將消息發(fā)送到隊(duì)列区赵,消費(fèi)者從隊(duì)列獲取消息惭缰。
? ? ? ? 2、一個(gè)隊(duì)列對(duì)應(yīng)一個(gè)消費(fèi)者笼才。
2漱受、工作隊(duì)列
? ? ? ? 1、一個(gè)生產(chǎn)者骡送,多個(gè)消費(fèi)者昂羡。
? ? ? ? 2、一個(gè)消息發(fā)送到隊(duì)列時(shí)摔踱,只能被一個(gè)消費(fèi)者獲取虐先。
? ? ? ? 3、多個(gè)消費(fèi)者并行處理消息派敷,提升消息處理速度蛹批。
? ? ? ? 注意:channel.basicQos(1)表示同一時(shí)刻只發(fā)送一條消息給消費(fèi)者撰洗。
3、發(fā)布/訂閱模式(Publish/Subcribe)
? ? ? ? 將消息發(fā)送到交換機(jī)腐芍,隊(duì)列從交換機(jī)獲取消息差导,隊(duì)列需要綁定到交換機(jī)。
? ? ? ? 1猪勇、一個(gè)生產(chǎn)者设褐,多個(gè)消費(fèi)者。
? ? ? ? 2泣刹、每一個(gè)消費(fèi)者都有自己的一個(gè)隊(duì)列助析。
? ? ? ? 3、生產(chǎn)者沒有將消息直接發(fā)送到隊(duì)列椅您,而是發(fā)送到交換機(jī)外冀。
? ? ? ? 4、每一個(gè)隊(duì)列都要綁定到交換機(jī)襟沮。
? ? ? ? 5锥惋、生產(chǎn)者發(fā)送的消息,經(jīng)過交換機(jī)到達(dá)隊(duì)列开伏,實(shí)現(xiàn)一個(gè)消息被多個(gè)消費(fèi)者獲取的目的膀跌。
? ? ? ? 6、交換機(jī)類型為“fanout”固灵。
? ? ? ? 注意:交換機(jī)本身沒有存儲(chǔ)消息的能力捅伤,消息只能存儲(chǔ)到隊(duì)列中。
4巫玻、路由模式(Routing)
? ? ? ? 路由模式是發(fā)布/訂閱模式的一種特殊情況丛忆。
? ? ? ? 1、路由模式的交換機(jī)類型為“direct”仍秤。
? ? ? ? 2熄诡、綁定隊(duì)列到交換機(jī)時(shí)指定 key,即路由鍵诗力,一個(gè)隊(duì)列可以指定多個(gè)路由鍵凰浮。
? ? ? ? 3、生產(chǎn)者發(fā)送消息時(shí)指定路由鍵苇本,這時(shí)袜茧,消息只會(huì)發(fā)送到綁定的key的對(duì)應(yīng)隊(duì)列中。
4瓣窄、主題模式(Topic)
? ? ? ? 將路由鍵和某模式進(jìn)行匹配笛厦。此時(shí),隊(duì)列需要綁定到一個(gè)模式上俺夕。符號(hào)“#”匹配一個(gè)或多個(gè)詞裳凸,“*”匹配不多不少一個(gè)詞贱鄙。
? ? ? ? 綁定隊(duì)列到交換機(jī)指定key時(shí),進(jìn)行通配符模式匹配姨谷。
三贰逾、RabbitMQ的其他特性
1、消息確認(rèn)機(jī)制
? ? ? ? 生產(chǎn)者發(fā)送消息到RabbitMQ服務(wù)器菠秒,消費(fèi)者從RabbitMQ服務(wù)器獲取消息,服務(wù)端如何知道消息被消費(fèi)者正常消費(fèi)了呢氯迂?這就要說消息確認(rèn)機(jī)制践叠,RabbitMQ有兩種消息確認(rèn)機(jī)制。
? ? ? ? 模式1:自動(dòng)確認(rèn)
? ? ? ? 只要消息從隊(duì)列中獲取嚼蚀,無(wú)論消費(fèi)者獲取到消息后是否成功消費(fèi)消息禁灼,服務(wù)端都認(rèn)為消息成功被消費(fèi)。
? ? ? ? 模式2:手動(dòng)確認(rèn)
? ? ? ? 消費(fèi)者從隊(duì)列獲取消息后轿曙,服務(wù)器會(huì)將消息標(biāo)記為不可用狀態(tài)弄捕,等待消費(fèi)者的反饋。如果消費(fèi)者一直沒有反饋导帝,那么該消息將一直處于不可用狀態(tài)守谓。api:channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);
2、持久化交換機(jī)和隊(duì)列
? ? ? ? 持久化:將交換機(jī)或隊(duì)列數(shù)據(jù)保存到磁盤您单,服務(wù)器宕機(jī)或者重啟之后數(shù)據(jù)依然存在斋荞。
? ? ? ? 非持久化:將交換機(jī)或隊(duì)列數(shù)據(jù)保存到磁盤到內(nèi)存,服務(wù)器宕機(jī)或者重啟之后數(shù)據(jù)會(huì)丟失虐秦。
? ? ? ? 持久化性能要低于持久化平酿,是否開啟持久化取決于業(yè)務(wù)需求。
? ? ? ??