三個概念
- 生產者:生產消息的服務
- 消息代理:消息中間件,如RabbitMQ
- 消費者:獲取使用消息的服務
消息隊列到達消費者的兩種形式
-
隊列(queue):點對點消息通信(point-to-point)
消息進入隊列,消費者監聽隊列,一旦有消息則獲取消息,消息被獲取后移除隊列。
隊列可以被多個消費者監聽,但是只有一個可以獲取。 -
主題(topic):發布(publish)/訂閱(subscribe)消息通信|
發布者(生產者)發送消息到主題,多個訂閱者(消費者)訂閱(監聽)這個主題,則在消息到達的同時就會同時得到消息
兩種常見的消息中間件協議
-
JMA:(Java Message Servier) Java 消息服務
-基于JVM消息代理規范。ActiveMQ、HornetMQ是JMS實現 -
AMQP:(Advanced Message Queuing Protocol)
-高級消息隊列協議,兼容JMS
-RabbitMQ是AMOP的實現。主要區別 JMS AMOP 跨語言 否 是 跨平臺 否 是 model 1) point-to-point 點對點
2)topic 主題1)direct exchange(直接交換機)—點對點
2)fanout exchange
3)topic exchange
交換機類型
direct(直接)、fanout(扇出)、topic(主題)、headers
direct
路由鍵需要與binding全匹配才行
fanout–廣播模式
不處理綁定和路由鍵,收到消息直接全部發送,類似廣播
topic
需要綁定關系(binding)和路由鍵(routing key)按一定規則匹配,路由鍵和綁定關系分割成單詞,單詞間用".“隔開。同時會識別兩個通配符”#“和”*“。”#"匹配0個或多個單詞 "*"匹配一個單詞
RabbitMQ的執行流程
生產者:建立一個長連接,通過連接里面的信道發送消息-指定哪一個交換機。
消息message:頭+體:消息頭中有一個很重要的路由鍵 (Routing Key)
RabbitMQ:消息到達中間件,服務器會交給交換機(exchange),交換機會根據消息中的路由鍵(routing key)去尋找對應的綁定關系(binding),然后消息入隊。
**消費者:**建立一個長連接,每個長連接會有很多信道。每個信道用來監聽隊列
消息確認機制
confirmCallback:消息達到消息服務(broker),就會執行。集群模式下,要被所有的代理都接受到才會執行。
returnCallback:交換機到隊列投遞失敗后執行。
ack:消費者獲取消息后自動確認,服務端會刪除這個消息。需改為手動確認。否則宕機后會消息丟失。調用channel.basicAck()方法簽收