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

RabbitMQ養(yǎng)成記 (10.高級(jí)特性:死信隊(duì)列,延遲隊(duì)列)

這篇具有很好參考價(jià)值的文章主要介紹了RabbitMQ養(yǎng)成記 (10.高級(jí)特性:死信隊(duì)列,延遲隊(duì)列)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

死信隊(duì)列(DLX)

這個(gè)概念 在其他MQ產(chǎn)品里面也是有的,只不過(guò)在Rabbitmq中稍微特殊一點(diǎn)
什么叫私信隊(duì)列呢? 就是當(dāng)消息成為 dead message之后,可以重新發(fā)到另外一臺(tái)交換機(jī),這個(gè)交換機(jī)就是DLX。

RabbitMQ養(yǎng)成記 (10.高級(jí)特性:死信隊(duì)列,延遲隊(duì)列)

注意這里的有翻譯歧義, 這里的DLX 指的是 交換機(jī) ,而不是一個(gè)隊(duì)列。

消息成為死信隊(duì)列的三種情況

  • 隊(duì)列的消息長(zhǎng)度 到達(dá)限制。

  • 消費(fèi)者拒收消息,

            channel.basicNack(deliveryTag,true,false);
            
            //這里拒收消息
            /**
             * deliveryTag 標(biāo)識(shí)
             * requeue 是否打回原隊(duì)列如果為false 則進(jìn)入死信隊(duì)列
             */
            channel.basicReject(deliveryTag,false);
        }
  • 存在消息過(guò)期設(shè)置 消息超時(shí)未消費(fèi)(就是上一篇中的TTL)

我們拿這個(gè)TTL舉例:

首先你在發(fā)送端 需要有2個(gè)隊(duì)列 一個(gè)正常隊(duì)列 一個(gè)私信隊(duì)列
然后你在創(chuàng)建延時(shí)隊(duì)列的時(shí)候 要注明 這個(gè)隊(duì)列的消息一旦超時(shí) 那么送到哪個(gè)死信交換機(jī)的隊(duì)列里面去:

@Configuration
public class RabbitMQConfig {
    public static final String EXCHANGE_NAME = "boot_topic_exchange";
    public static final String QUEUE_NAME_TTL = "boot_queue_ttl";

    public static final String DEAD_EXCHANGE_NAME = "dead_topic_exchange";
    public static final String DEAD_QUEUE_NAME = "dead_queue";

    //正常交換機(jī)

    @Bean("bootExchange")
    public Exchange bootExchange(){
        return ExchangeBuilder.topicExchange(EXCHANGE_NAME).durable(true).build();
    }


    @Bean("bootQueue")
    public Queue bootQueue(){
        Map<String, Object> map = new HashMap<>();
        // 設(shè)置TTL
        map.put("x-message-ttl", 20000);
        // 設(shè)置死信的目的交換機(jī)
        map.put("x-dead-letter-exchange", DEAD_EXCHANGE_NAME);
        // 設(shè)置死信交給目的交換機(jī)時(shí)的路由鍵
        map.put("x-dead-letter-routing-key", "boot.111");
        return QueueBuilder.durable(QUEUE_NAME_TTL).withArguments(map).build();
    }


    @Bean
    public Binding bindQueueExchange(@Qualifier("bootQueue") Queue queue,@Qualifier("bootExchange") Exchange exchange){
       return BindingBuilder.bind(queue).to(exchange).with("boot.#").noargs();
    }

    //死信交換機(jī)
    @Bean("deadExchange")
    public Exchange deadExchange(){
        return ExchangeBuilder.topicExchange(DEAD_EXCHANGE_NAME).durable(true).build();
    }

    @Bean("deadQueue")
    public Queue deadQueue(){
        return QueueBuilder.durable(DEAD_QUEUE_NAME).build();
    }

    @Bean
    public Binding bindDeadQueueExchange(@Qualifier("deadQueue") Queue queue,@Qualifier("deadExchange") Exchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("boot.*").noargs();
    }


}

好了 我們發(fā)送消息 往正常隊(duì)列里面發(fā):
RabbitMQ養(yǎng)成記 (10.高級(jí)特性:死信隊(duì)列,延遲隊(duì)列)

看超時(shí)之后 它進(jìn)來(lái)了:
RabbitMQ養(yǎng)成記 (10.高級(jí)特性:死信隊(duì)列,延遲隊(duì)列)


·這是超時(shí)的消息進(jìn)入DLX的情況
再動(dòng)動(dòng)手 我們實(shí)踐一下 消費(fèi)者拒收之后 進(jìn)入死信的情況:

我們監(jiān)聽(tīng)正常的隊(duì)列 然后接受到消息之后
我們故意寫(xiě)一個(gè)bug 觸發(fā)exception
調(diào)用basicNack方法 打回這個(gè)消息 讓它 進(jìn)入dlx
這里千萬(wàn)要注意:basicNack第三個(gè)參數(shù)要為false 才會(huì)進(jìn)入dlx

如果為true 那它就會(huì)打回到正常隊(duì)列 然后不停的給你發(fā)

    @RabbitListener(queues = "boot_queue_ttl")
    public void ListenerQueue(Message message,
                              @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag,
                              Channel channel) throws IOException {
        try {
            System.out.println("收到消息為"+new String(message.getBody()));

            System.out.println("處理業(yè)務(wù)邏輯。。");

//            int i =3/0; //手動(dòng)制造一個(gè)bug 讓程序進(jìn)入異常

            channel.basicAck(deliveryTag,true);

        }catch (Exception e){
            //拒絕簽收
            //這里的第三個(gè)參數(shù)表示 如果為true 消息重回到queue broker會(huì)重新發(fā)送該消息給消費(fèi)端
            System.out.println(" error 處理業(yè)務(wù)邏輯失敗 消息打回 進(jìn)入私信隊(duì)列");
            channel.basicNack(deliveryTag,true,false);
}

RabbitMQ養(yǎng)成記 (10.高級(jí)特性:死信隊(duì)列,延遲隊(duì)列)

ok我們實(shí)踐了兩種 第三種 超過(guò)隊(duì)列長(zhǎng)度的很簡(jiǎn)單 你設(shè)一個(gè)隊(duì)列長(zhǎng)度max=10 然后for循環(huán)往里面塞進(jìn)去>10 超過(guò)的就會(huì)進(jìn)入dlx 這種很簡(jiǎn)單
有興趣的好兄弟 可以自己去試一下啦
新手一定要多動(dòng)手


延遲隊(duì)列

什么是延遲隊(duì)列 就是交換機(jī)收到消息之后 它不急著發(fā) 它等。
等到你想要它發(fā)給消費(fèi)者方的時(shí)候 你再發(fā)。

假設(shè)你正在開(kāi)發(fā)一個(gè)電子商務(wù)網(wǎng)站,并且你希望為用戶提供一個(gè)訂單確認(rèn)后一段時(shí)間自動(dòng)取消的功能。當(dāng)用戶下單后,訂單將被發(fā)送到延遲隊(duì)列中,設(shè)置一個(gè)特定的延遲時(shí)間,例如30分鐘。如果在30分鐘內(nèi)用戶未支付訂單,系統(tǒng)將自動(dòng)取消該訂單。

但是問(wèn)題來(lái)了 rabbitmq 中并沒(méi)有提供現(xiàn)成的延遲隊(duì)列實(shí)現(xiàn),

需要我們自己去實(shí)現(xiàn):

怎么實(shí)現(xiàn)呢 如果你理解熟悉了 前面的TTL 和死信隊(duì)列之后
這個(gè)就非常非常簡(jiǎn)單了

看上面那個(gè)我們死信隊(duì)列里面那個(gè)例子:
發(fā)送端向正常隊(duì)列里面發(fā)數(shù)據(jù) 超時(shí)未消費(fèi)。 消息就進(jìn)入了死信隊(duì)列,

那就很簡(jiǎn)單了 你把消費(fèi)的監(jiān)聽(tīng)隊(duì)列 換成死信隊(duì)列 就ok了

他就是一個(gè)延遲隊(duì)列了文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-448297.html

到了這里,關(guān)于RabbitMQ養(yǎng)成記 (10.高級(jí)特性:死信隊(duì)列,延遲隊(duì)列)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • RabbitMQ延遲隊(duì)列,死信隊(duì)列配置

    延遲和死信隊(duì)列的配置 延遲隊(duì)列有效期一分鐘,后進(jìn)入死信隊(duì)列,如果異常就進(jìn)入異常隊(duì)列 異常隊(duì)列配置類

    2024年02月14日
    瀏覽(28)
  • RabbitMQ實(shí)現(xiàn)延遲消息,RabbitMQ使用死信隊(duì)列實(shí)現(xiàn)延遲消息,RabbitMQ延時(shí)隊(duì)列插件

    RabbitMQ實(shí)現(xiàn)延遲消息,RabbitMQ使用死信隊(duì)列實(shí)現(xiàn)延遲消息,RabbitMQ延時(shí)隊(duì)列插件

    假設(shè)有一個(gè)業(yè)務(wù)場(chǎng)景:超過(guò)30分鐘未付款的訂單自動(dòng)關(guān)閉,這個(gè)功能應(yīng)該怎么實(shí)現(xiàn)? RabbitMQ使用死信隊(duì)列,可以實(shí)現(xiàn)消息的延遲接收。 隊(duì)列有一個(gè)消息過(guò)期屬性。就像豐巢超過(guò)24小時(shí)就收費(fèi)一樣,通過(guò)設(shè)置這個(gè)屬性,超過(guò)了指定事件的消息將會(huì)被丟棄。 這個(gè)屬性交:x-message

    2024年02月13日
    瀏覽(104)
  • RabbitMQ實(shí)現(xiàn)延遲消息的方式-死信隊(duì)列、延遲隊(duì)列和惰性隊(duì)列

    當(dāng)一條消息因?yàn)橐恍┰驘o(wú)法被成功消費(fèi),那么這這條消息就叫做死信,如果包含死信的隊(duì)列配置了dead-letter-exchange屬性指定了一個(gè)交換機(jī),隊(duì)列中的死信都會(huì)投遞到這個(gè)交換機(jī)內(nèi),這個(gè)交換機(jī)就叫死信交換機(jī),死信交換機(jī)再綁定一個(gè)隊(duì)列,死信最終會(huì)進(jìn)入到這個(gè)存放死信的

    2024年02月19日
    瀏覽(94)
  • 【RabbitMQ學(xué)習(xí)日記】——死信隊(duì)列與延遲隊(duì)列

    【RabbitMQ學(xué)習(xí)日記】——死信隊(duì)列與延遲隊(duì)列

    死信,顧名思義就是無(wú)法被消費(fèi)的消息,字面意思可以這樣理解,一般來(lái)說(shuō), producer 將消息投遞到 broker 或者直接到 queue 里了, consumer 從 queue 取出消息進(jìn)行消費(fèi),但某些時(shí)候 由于特定的原因?qū)е?queue 中的某些消息無(wú)法被消費(fèi) ,這樣的消息如果沒(méi)有后續(xù)的處理,就變成了死

    2024年02月06日
    瀏覽(22)
  • RabbitMQ之TTL+死信隊(duì)列實(shí)現(xiàn)延遲隊(duì)列

    RabbitMQ是一個(gè)流行的消息隊(duì)列系統(tǒng),它提供了許多有用的功能,其中之一是TTL(Time To Live)和死信隊(duì)列。這些功能可以用來(lái)實(shí)現(xiàn)延遲隊(duì)列,讓我們來(lái)看看如何使用它們。 首先,什么是TTL?TTL是消息的存活時(shí)間,它可以設(shè)置為一個(gè)特定的時(shí)間段。如果消息在這個(gè)時(shí)間段內(nèi)沒(méi)有被

    2024年02月13日
    瀏覽(18)
  • (五)RabbitMQ-進(jìn)階 死信隊(duì)列、延遲隊(duì)列、防丟失機(jī)制

    (五)RabbitMQ-進(jìn)階 死信隊(duì)列、延遲隊(duì)列、防丟失機(jī)制

    Lison dreamlison@163.com , v1.0.0 , 2023.06.23 概念 在MQ中,當(dāng)消息成為死信(Dead message)后,消息中間件可以 將其從當(dāng)前隊(duì)列發(fā)送到另一個(gè)隊(duì)列中,這個(gè)隊(duì)列就是死信隊(duì)列。而 在RabbitMQ中,由于有交換機(jī)的概念,實(shí)際是將死信發(fā)送給了死 信交換機(jī)(Dead Letter Exchange,簡(jiǎn)稱DLX)。死信交

    2024年02月15日
    瀏覽(25)
  • 【RabbitMQ】 RabbitMQ 消息的延遲 —— 深入探索 RabbitMQ 的死信交換機(jī),消息的 TTL 以及延遲隊(duì)列

    【RabbitMQ】 RabbitMQ 消息的延遲 —— 深入探索 RabbitMQ 的死信交換機(jī),消息的 TTL 以及延遲隊(duì)列

    消息隊(duì)列是現(xiàn)代分布式應(yīng)用中的關(guān)鍵組件,用于實(shí)現(xiàn)異步通信、解耦系統(tǒng)組件以及處理高并發(fā)請(qǐng)求。消息隊(duì)列可以用于各種應(yīng)用場(chǎng)景,包括任務(wù)調(diào)度、事件通知、日志處理等。在消息隊(duì)列的應(yīng)用中,有時(shí)需要實(shí)現(xiàn)消息的延遲處理、處理未能成功消費(fèi)的消息等功能。 本文將介紹

    2024年02月05日
    瀏覽(95)
  • SpringCloudStream整合RabbitMQ用ttl+死信實(shí)現(xiàn)延遲隊(duì)列的實(shí)踐

    這篇是關(guān)于我使用Spring Cloud Steam操作RabbitMQ采用ttl+死信隊(duì)列的方式實(shí)現(xiàn)的延遲隊(duì)列。 在公司項(xiàng)目中遇到了需要延遲隊(duì)列的需求,為了以后可維護(hù)性和擴(kuò)展性要求必須要用Springcloud Stream組件來(lái)操作mq,而且公司的rabbit也不允許安裝延遲插件,只能用最原始的ttl+死信來(lái)實(shí)現(xiàn),在搭

    2024年02月12日
    瀏覽(26)
  • rabbitmq基礎(chǔ)7——隊(duì)列和消息過(guò)期時(shí)間設(shè)置、死信隊(duì)列、延遲隊(duì)列、優(yōu)先級(jí)隊(duì)列、回調(diào)隊(duì)列、惰性隊(duì)列

    rabbitmq基礎(chǔ)7——隊(duì)列和消息過(guò)期時(shí)間設(shè)置、死信隊(duì)列、延遲隊(duì)列、優(yōu)先級(jí)隊(duì)列、回調(diào)隊(duì)列、惰性隊(duì)列

    這里過(guò)一個(gè)知識(shí)點(diǎn)——過(guò)期時(shí)間,即對(duì)消息或隊(duì)列設(shè)置過(guò)期時(shí)間(TTL)。一旦消息過(guò)期,消費(fèi)就無(wú)法接收到這條消息,這種情況是絕不允許存在的,所以官方就出了一個(gè)對(duì)策——死信隊(duì)列,死信隊(duì)列最初出現(xiàn)的意義就是為了應(yīng)對(duì)消息過(guò)期丟失情況的手段之一。 那么過(guò)期時(shí)間具

    2024年02月03日
    瀏覽(100)
  • RabbitMQ學(xué)習(xí)——發(fā)布訂閱/fanout模式 & topic模式 & rabbitmq回調(diào)確認(rèn) & 延遲隊(duì)列(死信)設(shè)計(jì)

    RabbitMQ學(xué)習(xí)——發(fā)布訂閱/fanout模式 & topic模式 & rabbitmq回調(diào)確認(rèn) & 延遲隊(duì)列(死信)設(shè)計(jì)

    1.rabbitmq隊(duì)列方式的梳理,點(diǎn)對(duì)點(diǎn),一對(duì)多; 2.發(fā)布訂閱模式,交換機(jī)到消費(fèi)者,以郵箱和手機(jī)驗(yàn)證碼為例; 3.topic模式,根據(jù)規(guī)則決定發(fā)送給哪個(gè)隊(duì)列; 4.rabbitmq回調(diào)確認(rèn),setConfirmCallback和setReturnsCallback; 5.死信隊(duì)列,延遲隊(duì)列,創(chuàng)建方法,正?!佬?,設(shè)置延遲時(shí)間; 點(diǎn)對(duì)

    2024年02月13日
    瀏覽(92)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包