個人直播網(wǎng)站開發(fā)廣告安裝接單app
深入理解RabbitMQ交換機的原理與應(yīng)用
- 引言
- 1. RabbitMQ交換機簡介介紹
- 1.1 什么是RabbitMQ?
- 1.1.1 消息中間件的作用
- 1.1.2 RabbitMQ的特點和優(yōu)勢
- 1.2 RabbitMQ的基本概念
- 1.2.1 隊列
- 1.2.2 交換機
- 1.2.3 路由鍵
- 1.3 交換機的作用和分類
- 1.3.1 直連交換機(direct exchange)
- 1.3.2 扇出交換機(fanout exchange)
- 1.3.3 主題交換機(topic exchange)
- 1.3.4 頭交換機(headers exchange)
- 1.3.5 死信交換機
- 2. RabbitMQ交換機應(yīng)用
- 2.1直連交換機實踐
- 2.2 主題交換機實踐
- 2.3 扇形交換機實踐
- 總結(jié)
引言
在當(dāng)今的分布式系統(tǒng)和微服務(wù)架構(gòu)中,消息中間件扮演著至關(guān)重要的角色。RabbitMQ作為一個功能強大的消息中間件,其交換機是其中核心的組件之一。本文將深入探討RabbitMQ交換機的原理和應(yīng)用,幫助讀者更好地理解和應(yīng)用消息隊列技術(shù)。
1. RabbitMQ交換機簡介介紹
1.1 什么是RabbitMQ?
RabbitMQ是一個開源的消息代理軟件,它遵循AMQP(高級消息隊列協(xié)議)標(biāo)準(zhǔn),用于在分布式系統(tǒng)中存儲和轉(zhuǎn)發(fā)消息。作為消息中間件,RabbitMQ扮演著消息傳遞和消息隊列的角色,允許應(yīng)用程序之間進行異步通信。
1.1.1 消息中間件的作用
消息中間件的作用在于解耦消息的發(fā)送者和接收者,實現(xiàn)異步通信,提高系統(tǒng)的可伸縮性和彈性。它可以協(xié)調(diào)不同服務(wù)之間的通信,確保消息的可靠傳遞,并提供消息的持久化、路由和傳輸?shù)裙δ堋?/p>
1.1.2 RabbitMQ的特點和優(yōu)勢
RabbitMQ具有高可靠性、靈活的路由、消息持久化、集群和分布式部署支持等特點。它的優(yōu)勢在于支持多種消息傳遞模式,如點對點、發(fā)布/訂閱和路由等,同時提供了豐富的插件和管理工具。
1.2 RabbitMQ的基本概念
1.2.1 隊列
隊列是消息的容器,用于存儲消息直到消費者準(zhǔn)備接收它們。消息可以被一個或多個消費者訂閱。
1.2.2 交換機
交換機是消息的分發(fā)中心,它接收來自生產(chǎn)者的消息,并將它們路由到一個或多個隊列。
1.2.3 路由鍵
路由鍵是生產(chǎn)者在將消息發(fā)送到交換機時附加的關(guān)鍵字,交換機根據(jù)路由鍵將消息路由到一個或多個隊列。
1.3 交換機的作用和分類
交換機負責(zé)接收來自生產(chǎn)者的消息,并將它們路由到一個或多個隊列。RabbitMQ提供了不同類型的交換機,包括直連交換機、扇出交換機、主題交換機和頭交換機。
1.3.1 直連交換機(direct exchange)
直連交換機根據(jù)消息的路由鍵將消息路由到特定的隊列。它是最簡單的交換機類型,路由鍵與隊列綁定的路由鍵完全匹配時,消息才會被路由到相應(yīng)的隊列。
1.3.2 扇出交換機(fanout exchange)
扇出交換機會將消息路由到與之綁定的所有隊列,忽略消息的路由鍵。這種模式適合廣播消息給多個消費者的場景。
1.3.3 主題交換機(topic exchange)
主題交換機根據(jù)消息的路由鍵和通配符將消息路由到一個或多個隊列。它提供了更靈活的路由規(guī)則,可以根據(jù)路由鍵的模式進行匹配。
1.3.4 頭交換機(headers exchange)
頭交換機使用消息的屬性(headers)來進行匹配,而不是路由鍵。這種交換機類型提供了更復(fù)雜的匹配規(guī)則,可以根據(jù)消息的屬性進行匹配和路由。
1.3.5 死信交換機
2. RabbitMQ交換機應(yīng)用
2.1直連交換機實踐
創(chuàng)建好隊列與交換機,并且綁定
@Beanpublic Queue queue1(){return new Queue("queue1");}@Beanpublic Queue queue2(){return new Queue("queue2");}@Beanpublic DirectExchange drectexchange(){return new DirectExchange("drectexchange");}@Beanpublic Binding bingding1(){return BindingBuilder.bind(queue1()).to(drectexchange()).with("a");}@Beanpublic Binding bingding2(){return BindingBuilder.bind(queue2()).to(drectexchange()).with("b");}
生產(chǎn)者方法
@RequestMapping("/send3")public String send3(){//向消息隊列發(fā)送消息amqpTemplate.convertAndSend("drectexchange","a","hello");return "哈哈;";}
消費者監(jiān)聽
package com.example.consumer;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "queue1")
public class ReceiverQ1 {
@RabbitHandler
public void process(String msg) {
log.warn("Q1接收到:" + msg);
}
}
package com.example.consumer;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "queue2")
public class ReceiverQ2 {
@RabbitHandler
public void process(String msg) {
log.warn("Q2接收到:" + msg);
}
}
運行一遍send3方法
2.2 主題交換機實踐
前提準(zhǔn)備,打開RabbitMQ服務(wù),參考 構(gòu)建高可用消息隊列系統(tǒng) 01
進入實戰(zhàn)
創(chuàng)建好隊列與交換機,并且綁定
@Beanpublic TopicExchange topicExchange(){return new TopicExchange("topicExchange");}@Beanpublic Binding bingding3(){return BindingBuilder.bind(queue1()).to(topicExchange()).with("*.*.a");}@Beanpublic Binding bingding4(){return BindingBuilder.bind(queue2()).to(topicExchange()).with("*.*.b");}@Beanpublic Binding bingding5(){return BindingBuilder.bind(queue1()).to(topicExchange()).with("mq.#");}@Beanpublic Binding bingding6(){return BindingBuilder.bind(queue2()).to(topicExchange()).with("mq.#");}
生產(chǎn)者方法
@RequestMapping("/send4")public String send4(String rex){//向消息隊列發(fā)送消息amqpTemplate.convertAndSend("topicExchange",rex,"hello");return "哈哈;";}
消費者監(jiān)聽在直連交換機上有
測試1
測試2
測試3
mq打頭
2.3 扇形交換機實踐
創(chuàng)建好隊列與交換機,并且綁定
@Beanpublic FanoutExchange fanoutExchange(){return new FanoutExchange("fanoutExchange");}@Beanpublic Binding bingding7(){return BindingBuilder.bind(queue1()).to(fanoutExchange());}@Beanpublic Binding bingding8(){return BindingBuilder.bind(queue2()).to(fanoutExchange());}
生產(chǎn)者方法
生產(chǎn)者調(diào)用convertAndSend時第二個參數(shù)必須要有,可以給null值,否則報錯
@RequestMapping("/send5")public String send5(){//向消息隊列發(fā)送消息amqpTemplate.convertAndSend("fanoutExchange","","hello");return "哈哈;";}
消費者監(jiān)聽在直連交換機上有
測試
總結(jié)
RabbitMQ交換機作為消息中間件的核心組件,其靈活的路由規(guī)則和豐富的特性為分布式系統(tǒng)和微服務(wù)架構(gòu)提供了強大的消息通信支持。通過深理解RabbitMQ交換機的原理和應(yīng)用,可以更好地設(shè)計和構(gòu)建可靠的消息傳遞系統(tǒng),為復(fù)雜的應(yīng)用場景提供穩(wěn)定高效的消息通信機制。