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

RabbitMQ 消息隊列使用

這篇具有很好參考價值的文章主要介紹了RabbitMQ 消息隊列使用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

MQ

同步調(diào)用和異步調(diào)用

同步調(diào)用優(yōu)點:

時效性強,立即得到結(jié)果

缺點:

  • 耦合度高 新業(yè)務(wù)新需求到來時,需要修改代碼
  • 性能和吞吐能力下降 調(diào)用服務(wù)的響應(yīng)時間為所有服務(wù)的時間之和
  • 資源浪費 調(diào)用鏈中的服務(wù)在等待時不會釋放請求占用的資源
  • 級聯(lián)失敗 一個服務(wù)執(zhí)行失敗會導(dǎo)致調(diào)用鏈后續(xù)所有服務(wù)失敗

異步調(diào)用優(yōu)點:

  • 服務(wù)解耦 便于擴展
  • 性能提高 吞吐量提高
  • 不會級聯(lián)失敗
  • 流量削峰

RabbitMQ

基礎(chǔ)概念

  • channel: 操作MQ工具
  • exchange: 交換機, 將消息路由到隊列中
  • queue: 保存消息的隊列
  • virtual host: 虛擬主機, 相當于namespace,隔離的環(huán)境,對queue和exchange的邏輯分組

模型

基于 Spring Amqp

引入依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
簡單隊列 (Hello-World)

RabbitMQ 消息隊列使用,中間件,rabbitmq,ruby,分布式

消息發(fā)送者和接收者都需要以下配置:

spring:
  rabbitmq:
    port: 5672
    host: localhost
    virtual-host: /
    username: guest
    password: guest

發(fā)送消息:

@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringAmqpTest {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void helloWorldModel(){
        String queueName="zbq.queue1";
        String message="hello, spring amqp";
        rabbitTemplate.convertAndSend(queueName,message);
    }
}

消息接受:

@Component
@Slf4j
public class SpringRabbitListener {
    @RabbitListener(queues = "zbq.queue1")
    public void listenSimpleQueue(String msg){
        log.info("收到消息: "+msg);
    }
}

RabbitMQ 消息隊列使用,中間件,rabbitmq,ruby,分布式

工作隊列 (Work Queue)

RabbitMQ 消息隊列使用,中間件,rabbitmq,ruby,分布式

發(fā)送者:

@Test
    public void workQueueModel(){
        String queueName="zbq.work.queue";
        String msg="hello, amqp ";
        for(int i=0;i<1000;i++){
            rabbitTemplate.convertAndSend(queueName,msg+i);
        }
    }

接收者:

@RabbitListener(queues = "zbq.work.queue")
public void listenWorkQueue1(String msg) throws InterruptedException {
    log.info("消費者1號接收到消息: "+msg);
    Thread.sleep(20);
}

@RabbitListener(queues = "zbq.work.queue")
public void listenWorkQueue2(String msg) throws InterruptedException {
    log.info("消費者2號接收到消息: "+msg);
    Thread.sleep(100);
}

RabbitMQ 消息隊列使用,中間件,rabbitmq,ruby,分布式

Pub/Sub (Fanout exchange)

RabbitMQ 消息隊列使用,中間件,rabbitmq,ruby,分布式

Fanout交換將將消息發(fā)送到每一個綁定到它的隊列中

  1. 聲明一個FanoutExchange,聲明2個隊列, 綁定隊列到FanoutExchange上
@Configuration
public class FanoutConfig {
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("zbq.fanout");
    }

    @Bean
    public Queue fanoutQueue1(){
        return new Queue("zbq.fanout.queue1");
    }

    @Bean
    public Binding bindingQueue1(Queue fanoutQueue1,FanoutExchange fanoutExchange){
        return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
    }

    @Bean
    public Queue fanoutQueue2(){
        return new Queue("zbq.fanout.queue2");
    }

    @Bean
    public Binding bindingQueue2(Queue fanoutQueue2,FanoutExchange fanoutExchange){
        return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);
    }
}

2.消費者監(jiān)聽這兩個隊列

@RabbitListener(queues = "zbq.fanout.queue1")
public void listenFanoutQueue1(String msg){
    log.info("消費者1收到Fanout消息: "+msg);
}

@RabbitListener(queues = "zbq.fanout.queue2")
public void listenFanoutQueue2(String msg){
    log.info("消費者2收到Fanout消息: "+msg);
}

3.發(fā)消息到fanoutexchange

@Test
public void fanoutModel(){
    String exchangeName="zbq.fanout";
    String msg="hello, fanout ";
    for(int i=0;i<10;i++){
        rabbitTemplate.convertAndSend(exchangeName,"",msg+i);
    }
}

查看消費者輸出信息

RabbitMQ 消息隊列使用,中間件,rabbitmq,ruby,分布式

Direct Exchange

Direct交換機會將消息按照路由規(guī)則發(fā)送到指定的隊列

RabbitMQ 消息隊列使用,中間件,rabbitmq,ruby,分布式

1.聲明交換機, 隊列,并綁定,添加routingkey

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "zbq.direct.queue1"),
    exchange = @Exchange(name="zbq.direct",type = ExchangeTypes.DIRECT),
    key = {"girlfriend","family"}
))
public void listenDirectQueue1(String msg){
    log.info("消費者1收到Direct消息: "+msg);
}

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "zbq.direct.queue2"),
    exchange = @Exchange(name="zbq.direct",type = ExchangeTypes.DIRECT),
    key = {"friend","family"}
))
public void listenDirectQueue2(String msg){
    log.info("消費者2收到Direct消息: "+msg);
}

2.發(fā)送消息

@Test
public void directModel(){
    String exchangeName="zbq.direct";
    String msg="晚上回去吃飯 ";
    for (int i = 0; i < 10; i++) {
        rabbitTemplate.convertAndSend(exchangeName,"family",msg+i);
    }
}

@Test
public void directModel2(){
    String exchangeName="zbq.direct";
    String msg="hello, direct";
    for (int i = 0; i < 10; i++) {
        rabbitTemplate.convertAndSend(exchangeName,"girlfriend",msg+i);
    }
}

RabbitMQ 消息隊列使用,中間件,rabbitmq,ruby,分布式

RabbitMQ 消息隊列使用,中間件,rabbitmq,ruby,分布式

Topic Exchange

話題交換機的routingkey 必須是多個單詞的列表,并以.分隔

可以使用通配符#*

#:代表0個或者多個單詞

*:代表1個單詞

RabbitMQ 消息隊列使用,中間件,rabbitmq,ruby,分布式

1.定義

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "zbq.topic.queue1"),
    exchange = @Exchange(name="zbq.topic",type = ExchangeTypes.TOPIC),
    key = "China.#"
))
public void listenTopicQueue1(String msg){
    log.info("消費者1收到Topic消息: "+msg);
}

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "zbq.topic.queue2"),
    exchange = @Exchange(name="zbq.topic",type = ExchangeTypes.TOPIC),
    key = "#.weather"
))
public void listenTopicQueue2(String msg){
    log.info("消費者2收到Topic消息: "+msg);
}

2.發(fā)消息

@Test
public void topicModel(){
    String exchangeName="zbq.topic";
    String msg="首都北京,今日氣溫10攝氏度";
    rabbitTemplate.convertAndSend(exchangeName,"China.weather",msg);
}

RabbitMQ 消息隊列使用,中間件,rabbitmq,ruby,分布式

序列化方式

@Test
public void test(){
    Map<String,Object> map=new HashMap<>();
    map.put("hair","long");
    map.put("eyes","big");
    rabbitTemplate.convertAndSend("zbq.queue1",map);
}

發(fā)送對象類型過去, 查看序列化后的值

RabbitMQ 消息隊列使用,中間件,rabbitmq,ruby,分布式

RabbitMQ默認使用JDK自帶序列化

引入以下依賴修改序列化方法:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

注入Bean

@Bean
public MessageConverter customMC(){
    return new Jackson2JsonMessageConverter();
}

RabbitMQ 消息隊列使用,中間件,rabbitmq,ruby,分布式文章來源地址http://www.zghlxwxcb.cn/news/detail-810928.html

到了這里,關(guān)于RabbitMQ 消息隊列使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 深入詳解高性能消息隊列中間件 RabbitMQ

    深入詳解高性能消息隊列中間件 RabbitMQ

    ? 目錄 1、引言 2、什么是 RabbitMQ ? 3、RabbitMQ 優(yōu)勢 4、RabbitMQ 整體架構(gòu)剖析 4.1、發(fā)送消息流程 4.2、消費消息流程 5、RabbitMQ 應(yīng)用 5.1、廣播 5.2、RPC VC++常用功能開發(fā)匯總(專欄文章列表,歡迎訂閱,持續(xù)更新...) https://blog.csdn.net/chenlycly/article/details/124272585 C++軟件異常排查從入

    2024年02月05日
    瀏覽(97)
  • 消息隊列中間件 - Docker安裝RabbitMQ、AMQP協(xié)議、和主要角色

    消息隊列中間件 - Docker安裝RabbitMQ、AMQP協(xié)議、和主要角色

    不管是微服務(wù)還是分布式的系統(tǒng)架構(gòu)中,消息隊列中間件都是不可缺少的一個重要環(huán)節(jié),主流的消息隊列中間件有RabbitMQ、RocketMQ等等,從這篇開始詳細介紹以RabbitMQ為代表的消息隊列中間件。 AMQP協(xié)議 AMQP協(xié)議是一個提供統(tǒng)一消息服務(wù)的應(yīng)用層標準協(xié)議,基于此協(xié)議的客戶端與

    2024年02月03日
    瀏覽(92)
  • 基于golang多消息隊列中間件的封裝nsq,rabbitmq,kafka

    場景 在創(chuàng)建個人的公共方法庫中有這樣一個需求,就是不同的項目會用到不同的消息隊列中間件,我的思路把所有的消息隊列中間件進行封裝一個消息隊列接口(MQer)有兩個方法一個生產(chǎn)一個消費,那么在實例化對象的時候根據(jù)配置文件指定當前項目使用的那個消息隊列中

    2024年02月14日
    瀏覽(93)
  • 利用消息中間件RabbitMQ創(chuàng)建隊列以及扇出(Fanout)、訂閱(Direct)、主題(Topic)交換機來完成消息的發(fā)送和監(jiān)聽接收(完整版)

    利用消息中間件RabbitMQ創(chuàng)建隊列以及扇出(Fanout)、訂閱(Direct)、主題(Topic)交換機來完成消息的發(fā)送和監(jiān)聽接收(完整版)

    目錄 一、前期項目環(huán)境準備 1.1父項目以及子項目 1.2配置pom.xml 1.3配置application.yml 二、扇出(Fanout)?交換機實現(xiàn)消息的發(fā)送和接收 2.1編寫子項目consumer(消費者,接收消息)的代碼實現(xiàn)扇出(Fanout)交換機接收消息 2.1.1consumer子項目結(jié)構(gòu) 2.1.2FanoutConfig類的實現(xiàn)扇出(Fanout)交

    2024年02月05日
    瀏覽(95)
  • 消息中間件RabbitMQ

    消息中間件RabbitMQ

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

    2024年01月17日
    瀏覽(104)
  • RabbitMQ消息中間件

    RabbitMQ消息中間件 RabbitMQ簡介 windows下安裝RabbitMQ RabbitMQ基本概念 RabbitMQ簡單模式 RabbitMQ工作隊列模式 RabbitMQ發(fā)布訂閱模式 RabbitMQ路由模式 RabbitMQ主題模式 RabbitMQ RPC模式 RabbitMQ發(fā)布確認模式

    2024年02月10日
    瀏覽(104)
  • 消息中間件之RabbitMQ

    消息中間件之RabbitMQ

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

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

    消息中間件RabbitMQ詳解

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

    2024年02月16日
    瀏覽(104)
  • RabbitMQ:可靠消息傳遞的強大消息中間件

    RabbitMQ:可靠消息傳遞的強大消息中間件

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

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

    高性能消息中間件 RabbitMQ

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

    2024年02月11日
    瀏覽(32)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包