前言
我先介紹RabbitMQ 和?JMS的關系:
RabbitMQ是一款輕量、可靠且易拓展的便捷的消息Broker,不同于很多java開發(fā)者所了解的那些Broker,RabbitMQ不是基于JMS的,而是AMQP(the Advanced Message Queuing Protocol )。所幸Java客戶端庫和Spring會幫我們集成——所以不要擔心使用RabbitMQ。雖然AMQP暴露了一些JMS的接口,但是AMQP和JMS在操作上是有很大不同的。
Exchanges, queues 和綁定關系
AMQP是由發(fā)布者和消費者構成的消息協(xié)議,發(fā)布者生產(chǎn)消息,消費者對消息進行消費。Broker負責對消息進行投遞,為了確保消息能夠準確投遞,Broker提供了兩個關鍵的組件:exchange(交換機)和queue(隊列),圖示:

發(fā)布者發(fā)送消息到交換機,消費者從隊列里面獲取消息進行消費。那么生產(chǎn)者和消費者是如何發(fā)現(xiàn)對方的呢?答案就是:exchange name,生產(chǎn)者或者消費者端創(chuàng)建一個exchange(通常exchange要攜帶public類型的name)。
How that publication happens depends on the circumstances, but one might put it in public API documentation or send it to known clients.
而消息又是如何從exchange路由到queue的呢?
1: queue綁定到exchange上,通常,消費者都會創(chuàng)建一個隊列并且同時綁定該隊列到指定的exchange上;
2:消費者接收從綁定的exchange上的queue獲取消息;
想要理解綁定的過程,先要了解一下AMQP 消息的結(jié)構:

headers 和?properties 是key/value 鍵值對,兩者的不同是:headers需要遵循AMQP的規(guī)范,而properties可以包含任意的應用程序的信息。message內(nèi)容為bytes。如果你想要傳遞文本,則需要encoding一下,一般為UTF8。
routing-key是headers的一種標準形式。Broker通過routing-key去將message匹配到queue上。每個隊列都會指定一個“綁定鍵”,一旦這個綁定鍵匹配到了routing-key的規(guī)則,則隊列就會接收消息。
AMQP的Exchange type 有四種(翻譯是四種,一般做3種)
1?Direct : 綁定key必須完全匹配routing key,并且不支持通配符
2?Topic :與Direct 類型相似,但是支持通配符 '#'可以匹配0到多個word, '.'號只支持一個word?
3?Fanout:?忽略routing-key 和 綁定鍵,所有發(fā)布的消息都會去綁定到隊列上
4?Headers:?
例如:
一個發(fā)布者發(fā)送一條message,message的routing-key 為"NYSE",exchange類型為topic,此時消費者創(chuàng)建了一個隊列“Stocks”,binding key 為 “#”,"."或者"NYSE",都可以匹配到這條消息,如果該消息的exchange類型為Direct,只有binding key 為 "NYSE"的消費者可以消費這條消息。
一個隊列也可以綁定到多個Exchange上,我們來看看這種場景:
翻譯不動了