一、簡介
? ? ? ? 介紹RabbitMQ首先需要知道MQ是什么,MQ是 message queue 的簡稱,是應用程序和應用程序之間通信的方法。
? ??????RabbitMQ是一個由erlang語言編寫的、開源的、在AMQP基礎上完整的、可復用的企業(yè)消息系統(tǒng)。支持多種語言,包括java、Python、ruby、PHP、C/C++等。
? ??????AMQP:advanced message queuing protocol ,一個提供統(tǒng)一消息服務的應用層標準高級消息隊列協(xié)議,是應用層協(xié)議的一個開放標準,為面向消息的中間件設計?;诖藚f(xié)議的客戶端與消息中間件可傳遞消息并不受客戶端/中間件不同產(chǎn)品、不同開發(fā)語言等條件的限制。
二、RabbitMQ五種消息發(fā)送模式
? ??????RabbitMQ包括五種隊列模式,簡單隊列、工作隊列、發(fā)布/訂閱、路由、主題、rpc等。
1、簡單隊列

? ? ? ? 1、生產(chǎn)者將消息發(fā)送到隊列,消費者從隊列獲取消息。
? ? ? ? 2、一個隊列對應一個消費者。
2、工作隊列

? ? ? ? 1、一個生產(chǎn)者,多個消費者。
? ? ? ? 2、一個消息發(fā)送到隊列時,只能被一個消費者獲取。
? ? ? ? 3、多個消費者并行處理消息,提升消息處理速度。
? ? ? ? 注意:channel.basicQos(1)表示同一時刻只發(fā)送一條消息給消費者。
3、發(fā)布/訂閱模式(Publish/Subcribe)

? ? ? ? 將消息發(fā)送到交換機,隊列從交換機獲取消息,隊列需要綁定到交換機。
? ? ? ? 1、一個生產(chǎn)者,多個消費者。
? ? ? ? 2、每一個消費者都有自己的一個隊列。
? ? ? ? 3、生產(chǎn)者沒有將消息直接發(fā)送到隊列,而是發(fā)送到交換機。
? ? ? ? 4、每一個隊列都要綁定到交換機。
? ? ? ? 5、生產(chǎn)者發(fā)送的消息,經(jīng)過交換機到達隊列,實現(xiàn)一個消息被多個消費者獲取的目的。
? ? ? ? 6、交換機類型為“fanout”。
? ? ? ? 注意:交換機本身沒有存儲消息的能力,消息只能存儲到隊列中。
4、路由模式(Routing)

? ? ? ? 路由模式是發(fā)布/訂閱模式的一種特殊情況。
? ? ? ? 1、路由模式的交換機類型為“direct”。
? ? ? ? 2、綁定隊列到交換機時指定 key,即路由鍵,一個隊列可以指定多個路由鍵。
? ? ? ? 3、生產(chǎn)者發(fā)送消息時指定路由鍵,這時,消息只會發(fā)送到綁定的key的對應隊列中。
4、主題模式(Topic)

? ? ? ? 將路由鍵和某模式進行匹配。此時,隊列需要綁定到一個模式上。符號“#”匹配一個或多個詞,“*”匹配不多不少一個詞。
? ? ? ? 綁定隊列到交換機指定key時,進行通配符模式匹配。
三、RabbitMQ的其他特性
1、消息確認機制
? ? ? ? 生產(chǎn)者發(fā)送消息到RabbitMQ服務器,消費者從RabbitMQ服務器獲取消息,服務端如何知道消息被消費者正常消費了呢?這就要說消息確認機制,RabbitMQ有兩種消息確認機制。
? ? ? ? 模式1:自動確認
? ? ? ? 只要消息從隊列中獲取,無論消費者獲取到消息后是否成功消費消息,服務端都認為消息成功被消費。
? ? ? ? 模式2:手動確認
? ? ? ? 消費者從隊列獲取消息后,服務器會將消息標記為不可用狀態(tài),等待消費者的反饋。如果消費者一直沒有反饋,那么該消息將一直處于不可用狀態(tài)。api:channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);
2、持久化交換機和隊列
? ? ? ? 持久化:將交換機或隊列數(shù)據(jù)保存到磁盤,服務器宕機或者重啟之后數(shù)據(jù)依然存在。
? ? ? ? 非持久化:將交換機或隊列數(shù)據(jù)保存到磁盤到內存,服務器宕機或者重啟之后數(shù)據(jù)會丟失。
? ? ? ? 持久化性能要低于持久化,是否開啟持久化取決于業(yè)務需求。
? ? ? ??