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

RabbitMQ常見問題之延遲消息

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

一、死信交換機

當一個隊列中的消息滿足下列情況之一時,可以成為死信(dead letter):

  • 消費者使用basic.rejectbasic.nack聲明消費失敗,并且消息的requeue參數(shù)設(shè)置為false
  • 消息是一個過期消息,超時無人消費
  • 要投遞的隊列消息堆積滿了,最早的消息可能成為死信

如果該隊列配置了dead-letter-exchange屬性,指定了一個交換機,那么隊列中的死信就會投遞到這個交換機中,而
這個交換機稱為死信交換機(Dead Letter Exchange,簡稱DLX)。
RabbitMQ常見問題之延遲消息,Server架構(gòu),# RabbitMQ,rabbitmq,分布式

二、TTL

RabbitMQ常見問題之延遲消息,Server架構(gòu),# RabbitMQ,rabbitmq,分布式

如果messagequeue都有ttl,采用更小的一方。

1. Queue指定死信交換機并設(shè)置TTL

@Configuration
public class CommonConfig {
    @Bean
    public DirectExchange ttlExchange(){
        return new DirectExchange("ttl.direct");
    }

    @Bean
    public Queue ttlQueue(){
        return QueueBuilder
                .durable("ttl.queue")
                .ttl(10000)
                .deadLetterExchange("dl.direct")
                .deadLetterRoutingKey("dl")
                .build();
    }

    @Bean
    public Binding ttlBinding(){
        return BindingBuilder.bind(ttlQueue()).to(ttlExchange()).with("ttl");
    }
}

2. 消息設(shè)置TTL

@Test
public void testTTLMessage(){
    Message message = MessageBuilder.withBody("hello ttl".getBytes(StandardCharsets.UTF_8))
            .setDeliveryMode(MessageDeliveryMode.PERSISTENT)
            .setExpiration("5000")
            .build();
    rabbitTemplate.convertAndSend("ttl.direct", "ttl", message);
    log.info("ttl消息已發(fā)送");
}

借助TTL機制可以用死信交換機模擬延遲隊列,但是設(shè)計上比較牽強,性能不好。

三、延遲隊列

這是官方提供的一些額外插件
https://www.rabbitmq.com/community-plugins.html

下載其中的DelayExchange插件,把.ez文件掛載到RabbitMQ容器的/plugins目錄下,然后進入容器,執(zhí)行

rabbitmq-plugins enable rabbitmq_delayed_message_exchange
root@7c4ba266e5bc:/# rabbitmq-plugins enable rabbitmq_delayed_message_exchange
Enabling plugins on node rabbit@7c4ba266e5bc:
rabbitmq_delayed_message_exchange
The following plugins have been configured:
  rabbitmq_delayed_message_exchange
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_prometheus
  rabbitmq_web_dispatch
Applying plugin configuration to rabbit@7c4ba266e5bc...
The following plugins have been enabled:
  rabbitmq_delayed_message_exchange

started 1 plugins.

1. SpringAMQP創(chuàng)建延遲隊列

基于@RabbitListener或者基于@Bean都可以。

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "delay.queue"),
            exchange = @Exchange(name = "delay.direct", delayed = "true"),
            key = "delay"
    ))
    public void listenDelayExchange(String msg){
        log.info("消費者接收到delay.queue的延遲消息:【" + msg + "】");
    }

RabbitMQ常見問題之延遲消息,Server架構(gòu),# RabbitMQ,rabbitmq,分布式

2. 設(shè)置消息延遲

這個插件只能在消息上設(shè)置延遲時間,沒有隊列設(shè)置延遲時間的概念,不過都是一樣的。
message要在Header上添加一個x-delay。

    @Test
    public void testDelayMessage(){
        Message message = MessageBuilder.withBody("hello delay".getBytes(StandardCharsets.UTF_8))
                .setDeliveryMode(MessageDeliveryMode.PERSISTENT)
                .setHeader("x-delay", 5000)
                .build();
        // confirm callback
        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
        rabbitTemplate.convertAndSend("delay.direct", "delay", message, correlationData);
        log.info("發(fā)送消息成功");
    }

3. 測試

直接運行測試,可能會報錯,因為rabbitmq意識到消息到了exchange卻沒有立即到queue,被認為錯誤,回調(diào)returnback,所以我們在ReturnCallBack中繞過這個限制。

@Slf4j
@Configuration
public class CommonConfig implements ApplicationContextAware {

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);
        rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey)->{
            //check if is delay message
            if (message.getMessageProperties().getReceivedDelay() != null && message.getMessageProperties().getReceivedDelay() > 0) {
                return;
            }
            log.error("消息發(fā)送到queue失敗,replyCode={}, reason={}, exchange={}, routeKey={}, message={}",
                    replyCode, replyText, exchange, routingKey, message.toString());
        });
    }
}

運行Test測試,可以看到Test方面,消息發(fā)送的時間為21:09:13

21:09:13:516  INFO 25468 --- [           main] o.s.a.r.c.CachingConnectionFactory       : Created new connection: rabbitConnectionFactory#2063c53e:0/SimpleConnection@6415f61e [delegate=amqp://rabbitmq@127.0.0.1:5672/, localPort= 62470]
21:09:13:557  INFO 25468 --- [           main] cn.itcast.mq.spring.SpringAmqpTest       : 發(fā)送消息成功

listener方面消息消費的時間為21:09:18,剛好5s。文章來源地址http://www.zghlxwxcb.cn/news/detail-800489.html

21:08:31:952  INFO 19532 --- [           main] cn.itcast.mq.ConsumerApplication         : Started ConsumerApplication in 1.735 seconds (JVM running for 2.357)
21:09:18:583  INFO 19532 --- [ntContainer#0-1] c.i.mq.listener.SpringRabbitListener     : 消費者接收到delay.queue的延遲消息:【hello delay】

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

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

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

相關(guān)文章

  • 架構(gòu)師必讀:RabbitMQ常見問題與解決辦法

    作者:禪與計算機程序設(shè)計藝術(shù) Apache RabbitMQ是一個開源的消息代理中間件,它可以實現(xiàn)在分布式系統(tǒng)中應用間、跨平臺和服務間通訊。本文通過常見問題解答的方式,講述了RabbitMQ的架構(gòu)、基本概念、術(shù)語、核心算法、具體操作步驟、代碼實例以及未來的發(fā)展方向等內(nèi)容,將

    2024年02月07日
    瀏覽(21)
  • RabbitMQ消息丟失、消息重復消費、消息順序性無法保證、消息積壓、一致性問題、系統(tǒng)可用性降低等這些常見問題怎么解決

    該文章專注于面試,面試只要回答關(guān)鍵點即可,不需要對框架有非常深入的回答,如果你想應付面試,是足夠了,抓住關(guān)鍵點 1. 消息丟失 問題 :在生產(chǎn)者發(fā)送消息到MQ、MQ內(nèi)部處理、消費者接收消息的任一環(huán)節(jié)都可能導致消息丟失。 解決方案 : 生產(chǎn)者確認機制 :確保消息

    2024年04月25日
    瀏覽(27)
  • RaabitMQ(三) - RabbitMQ隊列類型、死信消息與死信隊列、懶隊列、集群模式、MQ常見消息問題

    RaabitMQ(三) - RabbitMQ隊列類型、死信消息與死信隊列、懶隊列、集群模式、MQ常見消息問題

    這是RabbitMQ最為經(jīng)典的隊列類型。在單機環(huán)境中,擁有比較高的消息可靠性。 經(jīng)典隊列可以選擇是否持久化(Durability)以及是否自動刪除(Auto delete)兩個屬性。 Durability有兩個選項,Durable和Transient。 Durable表示隊列會將消息保存到硬盤,這樣消息的安全性更高。但是同時,由于需

    2024年02月14日
    瀏覽(1047)
  • RabbitMQ常見問題以及實際問題解決

    RabbitMQ常見問題以及實際問題解決

    ** ** 消息可靠性問題: 消息從生產(chǎn)者發(fā)送到Exchange,再到queue,再到消費者,有哪些導致消息丟失的可能性? 發(fā)送時丟失: - 生產(chǎn)者發(fā)送的消息為送達exchange - 消息到達exchange后未到達queue MQ宕機,queue將消息丟失 consumer接收到消息后未消費就宕機 ①生產(chǎn)者消息確認 RabbitMQ提供

    2024年02月16日
    瀏覽(23)
  • 如何解決RabbitMQ中的延遲消息問題

    如何解決RabbitMQ中的延遲消息問題

    首先我們要知道什么是死信? 當一個隊列中的消息滿足下列情況之一時,可以成為死信(dead letter): 消費者使用basic.reject或 basic.nack聲明消費失敗,并且消息的requeue參數(shù)設(shè)置為false。 消息是一個過期消息,超時無人消費。 要投遞的隊列消息堆積滿了,最早的消息可能成為

    2024年02月14日
    瀏覽(18)
  • Rabbitmq 常見問題處理

    Rabbitmq 常見問題處理

    Rabbitmq queue NaN status code 如下圖: 參考文章 原因分析: Queue在mear數(shù)據(jù)庫中存,但在隊列列表中并不存在,所以才會存在該問題,并且是在RabbitMQ做了鏡像集群的時候才會出現(xiàn)這樣的情況。 解決 刪除隊列再重建?;蛘咧貑㈢R像機器服務。

    2024年02月09日
    瀏覽(17)
  • mq常見問題:消息丟失、消息重復消費、消息保證順序

    mq常見問題:消息丟失、消息重復消費、消息保證順序 消息丟失問題 拿rabbitmq舉例來說,出現(xiàn)消息丟失的場景如下圖 從圖中可以看到一共有以下三種可能出現(xiàn)消息丟失的情況: 1 生產(chǎn)者丟消息 生產(chǎn)者在將數(shù)據(jù)發(fā)送到MQ的時候,可能由于網(wǎng)絡等原因造成消息投遞失敗 2MQ自身丟

    2024年02月09日
    瀏覽(22)
  • 消息隊列常見問題(1)-如何保障不丟消息

    消息隊列常見問題(1)-如何保障不丟消息

    目錄 1. 為什么消息隊列會丟消息? 2. 怎么保障消息可靠傳遞? 2.1 生產(chǎn)者不丟消息 2.2 服務端不丟消息 2.3 消費者不丟消息 3. 消息丟失如何快速止損? 3.1 完善監(jiān)控 3.2 完善止損工具 現(xiàn)在主流的消息隊列都會提供完善的高可用解決方案,但是我們依然會有多種原因?qū)е孪G

    2024年02月14日
    瀏覽(18)
  • 消息中間件中常見問題

    消息中間件中常見問題

    MQ的用途 異步發(fā)送(驗證碼,短信,郵件) MySQL,ES,Redis之間的數(shù)據(jù)同步 分布式事務 削峰填谷 消息可能丟失的環(huán)境 消息在產(chǎn)生端時候生產(chǎn)端掛掉,消息未到達交換機,消息丟失 消息在交換機未到達隊列,消息丟失 消息隊列中如果隊列掛掉消息也可能丟失 消費者未接收消

    2024年02月15日
    瀏覽(32)
  • RabbitMQ常見的應用問題

    在實際生產(chǎn)環(huán)境中,可能會由于網(wǎng)絡問題導致消息接收異常產(chǎn)生某種影響,基于這種情況我們需要保障消息的可靠性。 RabbitMQ中的消息可靠性也稱為消息補償,如下圖所示,可以保證消息的可靠性。 分為9種種步驟實現(xiàn)消息補償 1、生產(chǎn)者處理業(yè)務邏輯,將數(shù)據(jù)寫入到數(shù)據(jù)庫。

    2024年02月11日
    瀏覽(19)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包