目錄
RabbitMQ中交換機(jī)的基本概念與作用解析
交換機(jī)的作用:
交換機(jī)的類(lèi)型:
直連交換機(jī)(Direct Exchange):?將消息路由到與消息中的路由鍵(Routing Key)完全匹配的隊(duì)列。
主題交換機(jī)(Topic Exchange):?使用通配符匹配路由鍵,允許更靈活的消息路由。
扇形交換機(jī)(Fanout Exchange):?將消息廣播到與交換機(jī)綁定的所有隊(duì)列,無(wú)視消息的路由鍵。
頭部交換機(jī)(Headers Exchange):?使用消息頭信息進(jìn)行匹配,而不是路由鍵。
死信交換機(jī)(Dead Letter Exchange)是在消息隊(duì)列系統(tǒng)中一種用于處理死信(Dead Letter Messages)的機(jī)制。死信通常是指由于某些原因而無(wú)法被成功處理的消息,這些原因可能包括消息過(guò)期、消息被拒絕、隊(duì)列滿等。
?個(gè)人總結(jié):
RabbitMQ中交換機(jī)的基本概念與作用解析
交換機(jī)的作用:
- 消息分發(fā):?交換機(jī)接收發(fā)布者發(fā)送的消息,并負(fù)責(zé)將消息路由到一個(gè)或多個(gè)隊(duì)列。
- 路由規(guī)則定義:?通過(guò)交換機(jī)可以定義消息的路由規(guī)則,以確保消息被正確地發(fā)送到目標(biāo)隊(duì)列。
交換機(jī)的類(lèi)型:
-
直連交換機(jī)(Direct Exchange):?將消息路由到與消息中的路由鍵(Routing Key)完全匹配的隊(duì)列。
直連交換機(jī)只能通過(guò)queue發(fā)送一個(gè)請(qǐng)求,如果需要發(fā)送多個(gè)請(qǐng)求那么就要進(jìn)行多個(gè)配置
//--------直連交換機(jī)
@Bean
public Queue queue1() {
return new Queue("queue1");
}
@Bean
public Queue queue2() {
return new Queue("queue2");
}
@Bean
public DirectExchange directExchange(){
return new DirectExchange("exchange1");
}
@Bean
public Binding binding01(){
return BindingBuilder
.bind(queue1())
.to(directExchange())
.with("aa");
}
@Bean
public Binding binding02(){
return BindingBuilder
.bind(queue2())
.to(directExchange())
.with("bb");
}
?消費(fèi)者接受信息
@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "queue1")
public class ReceiverQ1 {
@RabbitHandler
public void process(String msg) {
log.warn("q1接收到:" + msg);
}
}
測(cè)試
@RestController
public class TestController {
@Autowired
private AmqpTemplate template;
@Autowired
private ObjectMapper objectMapper;
@RequestMapping("/send3")
public String send3(){
template.convertAndSend("directExchange","aa","hello");
return "??";
}
}
?
-
主題交換機(jī)(Topic Exchange):?使用通配符匹配路由鍵,允許更靈活的消息路由。
-
通配符的含義:
- 星號(hào)(*):?匹配一個(gè)單詞,可以出現(xiàn)在路由鍵的任意位置。例如,"animal.*"匹配"animal.rabbit"和"animal.cat"等。
- 井號(hào)(#):?匹配零個(gè)或多個(gè)單詞,只能出現(xiàn)在路由鍵的末尾。例如,"animal.#"匹配"animal.rabbit"、"animal.cat"和"animal.mammal.large"等。
主題交換機(jī)可以通過(guò)配置多個(gè)路由鍵來(lái)實(shí)現(xiàn)不同的鍵進(jìn)入不同的消費(fèi)者,如:交換機(jī)a,交換機(jī)b,
現(xiàn)在有一個(gè)包含a和b的鍵那么兩個(gè)都能進(jìn)入不同的消費(fèi)者功能更加強(qiáng)大,并且可以配置通配符,根據(jù)通配符 * #? 來(lái)實(shí)現(xiàn)進(jìn)入不同的消費(fèi)者
//--------------主題交換機(jī)
// *.*.aa -> Q1
// *.*.bb -> Q2
// mq.# -> Q1,Q2
// 一個(gè)隊(duì)列可以用多個(gè)綁定鍵
@Bean
public TopicExchange topicExchange(){
return new TopicExchange("topicExchange");
}
@Bean
public Binding binding03(){
return BindingBuilder
.bind(queue1())
.to(topicExchange())
.with("*.*.aa");
}
@Bean
public Binding binding04(){
return BindingBuilder
.bind(queue2())
.to(topicExchange())
.with("*.*.bb");
}
@Bean
public Binding binding05(){
return BindingBuilder
.bind(queue1())
.to(topicExchange())
.with("mq.#");
}
@Bean
public Binding binding06(){
return BindingBuilder
.bind(queue2())
.to(topicExchange())
.with("mq.#");
}
測(cè)試
@RestController
public class TestController {
@Autowired
private AmqpTemplate template;
@Autowired
private ObjectMapper objectMapper;
@RequestMapping("/send4")
public String send4(String rex){
template.convertAndSend("topicExchange",rex,"hello");
return "??";
}
}
?
-
扇形交換機(jī)(Fanout Exchange):?將消息廣播到與交換機(jī)綁定的所有隊(duì)列,無(wú)視消息的路由鍵。
扇形交換機(jī)可以統(tǒng)一發(fā)送請(qǐng)求,列入可以運(yùn)用到,商城活動(dòng)時(shí)統(tǒng)一給用戶(hù)發(fā)送商城活動(dòng)信息
//--------------扇形交換機(jī)
// 廣播,群發(fā)
//它上面的隊(duì)列不需要binding key
@Bean
public FanoutExchange fanoutExchange(){
return new FanoutExchange("fanoutExchange");
}
@Bean
public Binding binding07(){
return BindingBuilder
.bind(queue1())
.to(fanoutExchange());
}
@Bean
public Binding binding08(){
return BindingBuilder
.bind(queue2())
.to(fanoutExchange());
}
測(cè)試代碼
@RequestMapping("/send5")
public String send5(){
template.convertAndSend("fanoutExchange","","hello");
return "??";
}
?上述效果圖:
?
-
頭部交換機(jī)(Headers Exchange):?使用消息頭信息進(jìn)行匹配,而不是路由鍵。
頭部交換機(jī)(Headers Exchange)是RabbitMQ中的一種交換機(jī)類(lèi)型,與其他類(lèi)型的交換機(jī)(直連交換機(jī)、主題交換機(jī)、扇出交換機(jī))不同,頭部交換機(jī)使用消息的頭信息(Headers)而不是路由鍵來(lái)進(jìn)行消息的路由。頭部交換機(jī)提供更靈活的路由方式,允許根據(jù)消息頭的鍵值對(duì)進(jìn)行匹配。
?以下是頭部交換機(jī)的一些關(guān)鍵特性和使用方式:
消息頭信息:
- 鍵值對(duì):?消息頭是由一系列鍵值對(duì)組成的,用于描述消息的屬性。
- 自定義屬性:?消息頭可以包含自定義的屬性,根據(jù)應(yīng)用程序的需要定義不同的屬性信息。
匹配規(guī)則:
- 匹配方式:?消息通過(guò)匹配消息頭的鍵值對(duì)來(lái)確定路由目標(biāo)。
- 多條件匹配:?可以定義多個(gè)鍵值對(duì),消息需要滿足所有條件才能被正確路由。
綁定關(guān)系:
- 綁定頭信息:?在綁定隊(duì)列到頭部交換機(jī)時(shí),可以指定一個(gè)或多個(gè)鍵值對(duì)作為匹配條件。
- 匹配算法:?消息頭需要匹配綁定隊(duì)列時(shí)指定的鍵值對(duì)條件,才能被路由到相應(yīng)的隊(duì)列。
使用場(chǎng)景:
- 復(fù)雜路由邏輯:?當(dāng)消息的路由邏輯需要根據(jù)多個(gè)條件進(jìn)行判斷時(shí),頭部交換機(jī)提供了更靈活的解決方案。
- 自定義屬性:?當(dāng)消息攜帶有多個(gè)自定義屬性,需要根據(jù)這些屬性進(jìn)行復(fù)雜匹配時(shí),頭部交換機(jī)是一個(gè)合適的選擇。
示例:
- 如果有一個(gè)消息頭包含"content-type"為"application/json",并且"priority"為"high",一個(gè)隊(duì)列可以通過(guò)綁定這兩個(gè)條件到頭部交換機(jī)來(lái)接收符合這兩個(gè)條件的消息。
- 另一個(gè)隊(duì)列可以通過(guò)綁定"content-type"為"application/xml"的條件來(lái)接收不同類(lèi)型的消息。
頭部交換機(jī)適用于需要根據(jù)消息的多個(gè)屬性進(jìn)行復(fù)雜匹配的場(chǎng)景,提供了更高度定制化的消息路由能力。
-
死信交換機(jī)(Dead Letter Exchange)是在消息隊(duì)列系統(tǒng)中一種用于處理死信(Dead Letter Messages)的機(jī)制。死信通常是指由于某些原因而無(wú)法被成功處理的消息,這些原因可能包括消息過(guò)期、消息被拒絕、隊(duì)列滿等。
以下是關(guān)于死信交換機(jī)的基本概念和作用:
死信的產(chǎn)生原因:
- 消息過(guò)期:?消息在隊(duì)列中等待的時(shí)間超過(guò)了指定的過(guò)期時(shí)間。
- 消息被拒絕:?消費(fèi)者拒絕消費(fèi)消息,并且消息被標(biāo)記為不可重新投遞。
- 隊(duì)列滿:?隊(duì)列達(dá)到最大容量,無(wú)法再接收新的消息。
死信交換機(jī)的作用:
- 死信路由:?當(dāng)消息被標(biāo)記為死信時(shí),它會(huì)被發(fā)送到死信交換機(jī)。
- 重新處理或記錄:?可以通過(guò)死信交換機(jī)重新將消息發(fā)送到其他隊(duì)列,進(jìn)行額外處理,或者記錄日志以分析死信的原因。
死信交換機(jī)的配置:
- 綁定關(guān)系:?死信交換機(jī)與原始交換機(jī)或隊(duì)列建立綁定關(guān)系。
- 死信隊(duì)列:?定義一個(gè)死信隊(duì)列,接收由死信交換機(jī)路由的死信。
- 死信交換機(jī)類(lèi)型:?死信交換機(jī)可以是不同類(lèi)型的交換機(jī),根據(jù)具體需求選擇合適的類(lèi)型。
應(yīng)用場(chǎng)景:
- 錯(cuò)誤處理:?處理由于消息格式錯(cuò)誤等原因?qū)е碌乃佬拧?/li>
- 重試機(jī)制:?將死信重新發(fā)送到其他隊(duì)列進(jìn)行重試。
- 日志記錄:?記錄死信信息以便進(jìn)行故障排除和分析。
使用死信交換機(jī)可以提高消息系統(tǒng)的健壯性和可靠性,確保無(wú)法正常處理的消息得到妥善處理,避免消息的丟失或無(wú)法追蹤。配置死信交換機(jī)需要根據(jù)具體消息隊(duì)列系統(tǒng)的實(shí)現(xiàn)進(jìn)行設(shè)置,例如在RabbitMQ中,可以通過(guò)設(shè)置交換機(jī)和隊(duì)列的參數(shù)來(lái)實(shí)現(xiàn)死信機(jī)制。
?
?個(gè)人總結(jié):
1.直連交換機(jī)只能通過(guò)queue發(fā)送一個(gè)請(qǐng)求,如果需要發(fā)送多個(gè)請(qǐng)求那么就要進(jìn)行多個(gè)配置;
2.主題交換機(jī)可以通過(guò)配置多個(gè)路由鍵來(lái)實(shí)現(xiàn)不同的鍵進(jìn)入不同的消費(fèi)者,如:交換機(jī)a,交換機(jī)b,現(xiàn)在有一個(gè)包含a和b的鍵那么兩個(gè)都能進(jìn)入不同的消費(fèi)者功能更加強(qiáng)大,并且可以配置通配符,根據(jù)通配符 * #? 來(lái)實(shí)現(xiàn)進(jìn)入不同的消費(fèi)者;
3. * 星號(hào)代表匹配一個(gè)單詞,# 井號(hào)代表匹配一個(gè)或多個(gè)單詞;文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-821218.html
4.扇形交換機(jī)可以統(tǒng)一發(fā)送請(qǐng)求,列入可以運(yùn)用到,商城活動(dòng)時(shí)統(tǒng)一給用戶(hù)發(fā)送商城活動(dòng)信息;文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-821218.html
到了這里,關(guān)于消息隊(duì)列RabbitMQ.02.交換機(jī)的講解與使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!