国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

中間件_RabbitMQ五種消息模型

這篇具有很好參考價(jià)值的文章主要介紹了中間件_RabbitMQ五種消息模型。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


RabbitMQ官方文檔
RabbitMQ 提供了5種常用消息模型。但是其實(shí)3、4、5這三種都屬于訂閱模型,只不過進(jìn)行路由的方式不同。
中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型
中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型

1.簡單消息隊(duì)列模型

簡單消息隊(duì)列官方文檔

1、創(chuàng)建簡單消息隊(duì)列

中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型

2、導(dǎo)入依賴

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

3、編寫生產(chǎn)者測試類SpringAmqpTest,并利用 RabbitTemplate 實(shí)現(xiàn)消息發(fā)送

@SpringBootTest
public class SpringAMQPTest {
	//SpringAMQP提供的三個(gè)功能之一:封裝了 RabbitTemplate 工具,用于發(fā)送消息 (生產(chǎn)者)
    @Autowired
    private RabbitTemplate template;

    @Test
    void test(){
    	//利用RabbitTemplate提供的方法向指定隊(duì)列發(fā)送消息
        template.convertAndSend("simple.queue","Hello SpringAQMP!");
    }
}

4、編寫消費(fèi)者,監(jiān)聽隊(duì)列消息

@Component
public class MessageListener {
	  /**
     * SpringAMQP提供的三個(gè)功能之二:基于注解的監(jiān)聽器模式,異步接收消息 (消費(fèi)者)
     * @RabbitListener是SpringAMQP提供的監(jiān)聽消息隊(duì)列的注解
     * @param message
     */
    @RabbitListener(queues = "simple.queue")
    public void basicQueueListener(String message) {
        System.out.println("消費(fèi)者接收到消息:" + message);
    }
}

中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型

5、編寫生產(chǎn)者和消費(fèi)者的application.yml文件

spring:
  rabbitmq:
    host: 192.168.6.131
    port: 5672
    # 虛擬主機(jī)
    virtual-host: /
    username: rabbitmq
    password: 123456

中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型

6、測試

運(yùn)行生產(chǎn)者代碼后,simple.queue 隊(duì)列中產(chǎn)生了一條待消費(fèi)的消息。
中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型
運(yùn)行消費(fèi)者代碼后,隊(duì)列中的消息被消費(fèi)
中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型
中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型

2.Work工作隊(duì)列模型

work工作隊(duì)列官方文檔

1、 創(chuàng)建 work.queue 隊(duì)列

中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型

2、創(chuàng)建生產(chǎn)者測試類

    @Test
    void testWorkQueue(){
        String queueName = "work.queue";
        String message = "Hello SpringAQMP-";
        for (int i = 0; i < 20; i++) {
            template.convertAndSend(queueName,message+i);
        }
    }

3、創(chuàng)建消費(fèi)者測試類

    @RabbitListener(queues = "work.queue")
    public void workQueueListener01(String message) throws InterruptedException {
        System.out.println("消費(fèi)者01接收到消息:" + message + " - " + LocalTime.now());
        Thread.sleep(20);
    }
    @SneakyThrows
    @RabbitListener(queues = "work.queue")
    public void workQueueListener02(String message){
        System.out.println("消費(fèi)者02接收到消息:" + message + " - " + LocalTime.now());

4、修改消費(fèi)者的application.yml

正常情況下每個(gè)消費(fèi)者要消費(fèi)的消息數(shù)量是一樣的。消息是平均分配給每個(gè)消費(fèi)者,并沒有考慮到消費(fèi)者的處理能力。這樣顯然不合理,因此修改消費(fèi)者的配置文件使得每個(gè)消費(fèi)者按照能力順序處理信息

spring:
  rabbitmq:
    listener:
      simple: # 簡單隊(duì)列和work隊(duì)列的配置
        prefetch: 1 # 每次只能獲取一條消息,處理完成才獲取下一條消息

5、測試

運(yùn)行生產(chǎn)者和消費(fèi)者類,兩個(gè)消費(fèi)者收到的同一個(gè)隊(duì)列中的消息肯定是不一樣的。
中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型

3.發(fā)布訂閱模型

在發(fā)布訂閱模型中,多了一個(gè)exchange角色,而且過程略有變化:

  • producer:生產(chǎn)者,也就是要發(fā)送消息的程序,但是不再發(fā)送到隊(duì)列中,而是發(fā)給X(交換機(jī))

  • exchange:交換機(jī),一方面,接收生產(chǎn)者發(fā)送的消息。另一方面,知道如何處理消息,例如遞交給某個(gè)特別隊(duì)列、遞交給所有隊(duì)列、或是將消息丟棄。到底如何操作,取決于exchange的類型。exchange 有以下3種類型:

    • fanout:廣播,將消息交給所有綁定到交換機(jī)的隊(duì)列
    • direct:定向,把消息交給符合指定 routing key 的隊(duì)列
    • topic:通配符,把消息交給符合 routing pattern 的隊(duì)列
  • consumer:消費(fèi)者,訂閱隊(duì)列

  • queue:消息隊(duì)列,接收消息、緩存消息。

exchange(交換機(jī))只負(fù)責(zé)轉(zhuǎn)發(fā)消息,不具備存儲(chǔ)消息的能力,因此如果沒有任何隊(duì)列與 exchange 綁定,或者沒有符合路由規(guī)則的隊(duì)列,那么消息會(huì)被丟棄!
中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型

3.1.Fanout廣播

Fanout廣播官方文檔
中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型

在廣播模式下,消息發(fā)送流程是這樣的:

  • 可以有多個(gè)消費(fèi)者

  • 每個(gè)消費(fèi)者有自己的queue(隊(duì)列)

  • 每個(gè)隊(duì)列都要綁定到Exchange(交換機(jī))

  • 生產(chǎn)者發(fā)送的消息,只能發(fā)送到交換機(jī),交換機(jī)來決定要發(fā)給哪個(gè)隊(duì)列,生產(chǎn)者無法決定。

  • 交換機(jī)把消息發(fā)送給綁定過的所有隊(duì)列

  • 隊(duì)列的消費(fèi)者都能拿到消息。實(shí)現(xiàn)一條消息被多個(gè)消費(fèi)者消費(fèi)

  • 使用內(nèi)置的 amq.fanout 交換機(jī)
    中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型

  • 兩個(gè)隊(duì)列不用手動(dòng)創(chuàng)建,是在下面

1、創(chuàng)建生產(chǎn)者測試類

@Test
void testFanoutExchange() {
    rabbitTemplate.convertAndSend("amq.fanout", "", "Hello amq.fanout");
}

2、創(chuàng)建消費(fèi)者測試類


@Component
public class SpringRabbitListener {
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "fanout.queue01"),
            exchange = @Exchange(name = "amq.fanout", type = ExchangeTypes.FANOUT)
    ))
    public void fanoutQueueListener01(String message) {
        System.out.println("消費(fèi)者01接收到fanout.queue01的消息:" + message);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "fanout.queue02"),//使用@Queue(name = "fanout.queue01")RabbitMQ自動(dòng)生成隊(duì)列
            exchange = @Exchange(name = "amq.fanout", type = ExchangeTypes.FANOUT)
    ))
    public void fanoutQueueListener02(String message) {
        System.out.println("消費(fèi)者02接收到fanout.queue02的消息:" + message);
    }
}

3、測試

運(yùn)行生產(chǎn)者和消費(fèi)者
中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型
中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型

中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型

3.2.Direct路由

Direct路由官方文檔
中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型
在 Fanout 模式中,一條消息,會(huì)被所有訂閱的隊(duì)列都消費(fèi)。但是,在某些場景下,我們希望不同的消息被不同的隊(duì)列消費(fèi)。這時(shí)就要用到 direct 類型的 exchange。

Direct模型下:

  • 隊(duì)列與交換機(jī)的綁定要指定一個(gè) RoutingKey
  • 消息的發(fā)送方在向 exchange 發(fā)送消息時(shí),也必須指定消息的 RoutingKey。
  • exchange 不再把消息交給每一個(gè)綁定的隊(duì)列,而是根據(jù)消息的Routing Key進(jìn)行判斷,只有隊(duì)列的Routingkey 與消息的 Routing key 完全一致,才會(huì)接收到消息

1、創(chuàng)建生產(chǎn)者測試類

@Test
void testDirectExchange() {
    rabbitTemplate.convertAndSend("amq.direct", "save", "新增通知");
    rabbitTemplate.convertAndSend("amq.direct", "delete", "刪除通知");
}

2、創(chuàng)建消費(fèi)者測試類

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "direct.queue01"),
    exchange = @Exchange(name = "amq.direct", type = ExchangeTypes.DIRECT),
    key = {"save"}
))
// 處理新增的業(yè)務(wù)
public void directQueueListener01(String message){
    System.out.println("消費(fèi)者01接收到direct.queue01的消息:" + message);
}

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "direct.queue02"),
    exchange = @Exchange(name = "amq.direct", type = ExchangeTypes.DIRECT),
    key = {"delete"}
))
// 處理刪除的業(yè)務(wù)
public void directQueueListener02(String message){
    System.out.println("消費(fèi)者02接收到direct.queue02的消息:" + message);
}

3、測試

運(yùn)行生產(chǎn)者和消費(fèi)者測試類
中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型
中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型

3.3.Topics通配符

Topics通配符官方文檔
中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型
Topics 類型的 Exchange 與 Direct 相比,都是可以根據(jù) RoutingKey 把消息路由到不同的隊(duì)列。

不同的是 Topic類型的 Exchange 可以讓隊(duì)列在綁定 Routingkey 的時(shí)候使用通配符

通配符規(guī)則:

  • #:匹配一個(gè)或多個(gè)單詞

  • *:匹配一個(gè)單詞

舉例:

  • user.#:能夠匹配 user.add 或者 user.detail.add

  • user.*:只能匹配 user.add

1、創(chuàng)建生產(chǎn)者測試類

@Test
public void testTopicExchange() {
    rabbitTemplate.convertAndSend("amq.topic", "user.add", "新增用戶通知");
    rabbitTemplate.convertAndSend("amq.topic", "user.update", "更新戶通知");
    rabbitTemplate.convertAndSend("amq.topic", "dept.add", "新增部門通知");
    rabbitTemplate.convertAndSend("amq.topic", "dept.update", "更新部門通知");
}

2、創(chuàng)建消費(fèi)者測試類

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "topic.queue01"),
    exchange = @Exchange(name = "amq.topic", type = ExchangeTypes.TOPIC),
    key = "user.*"
))
public void topicQueueListener01(String message){
    System.out.println("消費(fèi)者01接收到topic.queue01的消息:" + message);
}

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "topic.queue02"),
    exchange = @Exchange(name = "amq.topic", type = ExchangeTypes.TOPIC),
    key = "dept.*"
))
public void topicQueueListener02(String message){
    System.out.println("消費(fèi)者02接收到topic.queue02的消息:" + message);
}

3、測試

運(yùn)行生產(chǎn)者和消費(fèi)者測試類
中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型
中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型
中間件_RabbitMQ五種消息模型,微服務(wù),java-rabbitmq,五種消息模型文章來源地址http://www.zghlxwxcb.cn/news/detail-736175.html

到了這里,關(guān)于中間件_RabbitMQ五種消息模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 消息中間件之RabbitMQ

    消息中間件之RabbitMQ

    1.基于AMQP協(xié)議Erlang語言開發(fā)的一款消息中間件,客戶端語言支持比較多, 比如Python,Java,Ruby,PHP,JS,Swift.運(yùn)維簡單,靈活路由,但是性能不高, 可以滿足一般場景下的業(yè)務(wù)需要,三高場景下吞吐量不高,消息持久化沒有采取 零拷貝技術(shù),消息堆積時(shí),性能會(huì)下降 2.消息吞吐量在

    2024年01月19日
    瀏覽(22)
  • 消息中間件RabbitMQ詳解

    消息中間件RabbitMQ詳解

    消息中間件利用高效可靠的消息傳遞機(jī)制進(jìn)行平臺(tái)無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進(jìn)行分布式系統(tǒng)的集成。通過提供消息傳遞和消息排隊(duì)模型,它可以在分布式環(huán)境下擴(kuò)展進(jìn)程間的通信。 消息中間件適用于需要可靠的數(shù)據(jù)傳送的分布式環(huán)境。采用消息中間件機(jī)制的系統(tǒng)中

    2024年02月16日
    瀏覽(104)
  • 中間件RabbitMQ消息隊(duì)列介紹

    中間件RabbitMQ消息隊(duì)列介紹

    1.1 什么是 MQ MQ ( message queue ),從字面意思上看,本質(zhì)是個(gè)隊(duì)列, FIFO 先入先出,只不過隊(duì)列中存放的內(nèi)容是 message 而已,還是一種跨進(jìn)程的通信機(jī)制,用于上下游傳遞消息。在互聯(lián)網(wǎng)架構(gòu)中, MQ 是一種非常常 見的上下游 邏輯解耦+物理解耦 的消息通信服務(wù)。使用了 MQ 之

    2024年02月13日
    瀏覽(118)
  • RabbitMQ:可靠消息傳遞的強(qiáng)大消息中間件

    RabbitMQ:可靠消息傳遞的強(qiáng)大消息中間件

    ?消息中間件在現(xiàn)代分布式系統(tǒng)中起著關(guān)鍵作用,它們提供了一種可靠且高效的方法來進(jìn)行異步通信和解耦。在這篇博客中,我們將重點(diǎn)介紹 RabbitMQ,一個(gè)廣泛使用的開源消息中間件。我們將深入探討 RabbitMQ 的特性、工作原理以及如何在應(yīng)用程序中使用它來實(shí)現(xiàn)可靠的消息傳

    2024年02月12日
    瀏覽(27)
  • 高性能消息中間件 RabbitMQ

    高性能消息中間件 RabbitMQ

    消息隊(duì)列 MQ全稱Message Queue(消息隊(duì)列),是在消息的傳輸過程中保存消息的容器。多用于系統(tǒng)之間的 異步通信 。 同步通信相當(dāng)于兩個(gè)人當(dāng)面對(duì)話,你一言我一語。必須及時(shí)回復(fù): 異步通信相當(dāng)于通過第三方轉(zhuǎn)述對(duì)話,可能有消息的延遲,但不需要二人時(shí)刻保持聯(lián)系。 消息

    2024年02月11日
    瀏覽(32)
  • Springboot整合RabbitMQ消息中間件

    spring-boot-rabbitmq–消息中間件整合 前言:RabbitMQ的各種交換機(jī)說明 1、直連交換機(jī) 生產(chǎn)者發(fā)布消息時(shí)必須帶著routing-key,隊(duì)列綁定到交換機(jī)時(shí)必須指定binding-key ,且routing-key和binding-key必須完全相同,如此才能將消息路由到隊(duì)列中 直連交換機(jī)通常用來循環(huán)分發(fā)任務(wù)給多個(gè)workers,

    2024年02月11日
    瀏覽(33)
  • 消息隊(duì)列中間件(二)- RabbitMQ(一)

    消息隊(duì)列中間件(二)- RabbitMQ(一)

    接收,存儲(chǔ),轉(zhuǎn)發(fā)消息 生產(chǎn)者 交換機(jī) 隊(duì)列 消費(fèi)者 簡單模式 工作模式 發(fā)布 路由模式 主題模式 發(fā)布訂閱模式 Broker 接收和分發(fā)消息的應(yīng)用 Virtual host 虛擬分組 Connection: TCP連接 Channel: 節(jié)省連接,每次訪問建立一次Connection消耗太大,所以使用信道代替連接 交換機(jī) 隊(duì)列 www.r

    2024年02月11日
    瀏覽(94)
  • 「中間件」rabbitmq 消息隊(duì)列基礎(chǔ)知識(shí)

    RabbitMQ是一個(gè)消息隊(duì)列軟件,用于在應(yīng)用程序之間轉(zhuǎn)發(fā)消息。以下是RabbitMQ的基本概念: 消息:RabbitMQ中的消息是傳遞的基本單位,它由消息頭和消息體組成。 隊(duì)列(Queue):隊(duì)列是消息的緩沖區(qū),用于存儲(chǔ)待處理的消息。 交換器(Exchange):交換器是接收生產(chǎn)者發(fā)送的消息并

    2024年02月07日
    瀏覽(97)
  • 快速掌握MQ消息中間件rabbitmq

    Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive. happy for hardess to solve denpendies. 需求: 1.video A https://www.bilibili.com/video/BV1cb4y1o7zz?p=12vd_source=533ee415c42b820b0f4105acb4932a02 參考資料 官方文檔 開源社區(qū) 博客文

    2024年02月11日
    瀏覽(28)
  • RabbitMQ 消息中間件與集群的部署

    RabbitMQ 消息中間件與集群的部署

    1、消息中間件 1、簡介 消息中間件也可以稱消息隊(duì)列,是指用高效可靠的消息傳遞機(jī)制進(jìn)行與平臺(tái)無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進(jìn)行分布式系統(tǒng)的集成。通過提供消息傳遞和消息隊(duì)列模型,可以在分布式環(huán)境下擴(kuò)展進(jìn)程的通信。 當(dāng)下主流的消息中間件有RabbitMQ、Kafka、

    2024年02月21日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包