最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于Rabbitmq死信隊(duì)列及延時(shí)隊(duì)列的實(shí)現(xiàn)

 更新時(shí)間:2023年08月17日 10:43:29   作者:信仰_273993243  
這篇文章主要介紹了關(guān)于Rabbitmq死信隊(duì)列及延時(shí)隊(duì)列的實(shí)現(xiàn),TTL就是消息或者隊(duì)列的過(guò)期功能,當(dāng)消息過(guò)期就會(huì)進(jìn)到死信隊(duì)列,死信隊(duì)列和普通隊(duì)列沒(méi)啥區(qū)別,然后我們只需要配置一個(gè)消費(fèi)者來(lái)消費(fèi)死信隊(duì)列里面的消息就可以了,需要的朋友可以參考下

什么是延遲隊(duì)列

我們常說(shuō)的延遲隊(duì)列是指消息進(jìn)入隊(duì)列后不會(huì)被立即消費(fèi),只有達(dá)到指定時(shí)間后才能被消費(fèi)。

但RabbitMq中并沒(méi)有提供延遲隊(duì)列功能。

那么RabbitMQ如何實(shí)現(xiàn)延遲隊(duì)列

通過(guò):死信隊(duì)列 + RabbitMQ的TTL特性實(shí)現(xiàn)。

實(shí)現(xiàn)原理

給一個(gè)普通帶有過(guò)期功能的隊(duì)列綁定一個(gè)死信隊(duì)列,消息先進(jìn)延時(shí)隊(duì)列,過(guò)期了后消息進(jìn)入死信隊(duì)列,死信隊(duì)列的消息會(huì)轉(zhuǎn)發(fā)到對(duì)應(yīng)的queue里面,我們只需要消費(fèi)死信的queue里面的消息就可以了。

一、TTL特性說(shuō)明

TTL就是消息或者隊(duì)列的過(guò)期功能。

當(dāng)消息過(guò)期就會(huì)進(jìn)到死信隊(duì)列,死信隊(duì)列和普通隊(duì)列沒(méi)啥區(qū)別,然后我們只需要配置一個(gè)消費(fèi)者來(lái)消費(fèi)死信隊(duì)列里面的消息就可以了。

如果不設(shè)置x-message-ttl,則表示消息不會(huì)過(guò)期如果x-message-ttl設(shè)置為0,則表示除非此時(shí)可以直接投遞該消息到消費(fèi)者,否則該消息將會(huì)被丟棄。
如果x-message-ttl設(shè)置不為0,表明消息或隊(duì)列中所有消息的最大存活時(shí)間(過(guò)期時(shí)間),單位是毫秒。

需要注意: RabbitMQ只會(huì)對(duì)隊(duì)列頭部的消息進(jìn)行過(guò)期淘汰,消息是否過(guò)期是在即將投遞消息到消費(fèi)者之前判定的,如果隊(duì)列出現(xiàn)消息堆積情況,則已過(guò)期的消息還是會(huì)繼續(xù)存活的

比如過(guò)期時(shí)間設(shè)置在消息上,由于消息進(jìn)隊(duì)列是先進(jìn)先出,假設(shè)先進(jìn)去的消息過(guò)期時(shí)間長(zhǎng),后進(jìn)的消息過(guò)期時(shí)間短,先進(jìn)來(lái)的消息還沒(méi)過(guò)期,后面進(jìn)來(lái)的消息就算到了過(guò)期時(shí)間,消息也不會(huì)過(guò)期也就不會(huì)從隊(duì)列中剔除,從而導(dǎo)致隊(duì)列里面的消息積壓。

二、死信隊(duì)列

簡(jiǎn)單理解就是要被丟棄的消息才會(huì)放到死信隊(duì)列。

1、消息什么時(shí)候變?yōu)樗佬?/strong>

1、消息被否定接收,消費(fèi)者使用basic.reject 或者 basic.nack并且requeue重回隊(duì)列屬性設(shè)為false

2、消息在隊(duì)列里的時(shí)間超過(guò)了該消息設(shè)置的過(guò)期時(shí)間(TTL)

3、消息隊(duì)列到達(dá)了它的最大長(zhǎng)度,之后再收到的消息。

2、死信隊(duì)列的原理

當(dāng)一個(gè)消息在隊(duì)列里變?yōu)樗佬?,它?huì)被重新publish到綁定的死信隊(duì)列所對(duì)應(yīng)的exchange交換機(jī)上,這個(gè)exchange就為DLX。因此我們只需要在聲明正常的業(yè)務(wù)隊(duì)列時(shí)添加一個(gè)可選的"x-dead-letter-exchange"參數(shù),值為死信交換機(jī),死信就會(huì)被rabbitmq重新publish到配置的這個(gè)交換機(jī)上,我們接著監(jiān)聽(tīng)這個(gè)死信交換機(jī)所綁定隊(duì)列就可以了。

下面看個(gè)案例: 正常情況,我們配置交換機(jī)-A,會(huì)為其綁定路由鍵-A,和路由鍵-A所映射的隊(duì)列-A,并設(shè)置這個(gè)隊(duì)列-A的死信交換機(jī)-B、死信路由鍵-B。

消息消費(fèi)者-A,監(jiān)聽(tīng)隊(duì)列-A,基本上就沒(méi)死信交換機(jī)什么事了,特殊時(shí)候隊(duì)列滿了,或者接收后給的回執(zhí)是false才會(huì)進(jìn)到死信交換機(jī)-B。

現(xiàn)在我們把消費(fèi)者-A刪了,并且設(shè)置隊(duì)列-A里面消息過(guò)期時(shí)間,那么所有進(jìn)到隊(duì)列A里面消息就自然過(guò)期,然后被推給死信交換機(jī),那么監(jiān)聽(tīng)死信交換機(jī)-B的消息者-B,就可以得到過(guò)期后的消息了,就實(shí)現(xiàn)了延時(shí)功能。

3、死信交換機(jī)

死信交換機(jī)DLX實(shí)際上也是普通的交換機(jī),說(shuō)白的就是將死信(過(guò)期消息)路由到死信隊(duì)列的交換機(jī)。

4、死信隊(duì)列

死信隊(duì)列DLQ(Dead Letter Queue)實(shí)際上也是普通的隊(duì)列,只不過(guò)它存儲(chǔ)的是死信交換機(jī)路由過(guò)來(lái)的死信(過(guò)期消息)

三、代碼

1、給隊(duì)列綁定死信隊(duì)列

Map<String, Object> args = new HashMap<>(2);
args.put(x-dead-letter-exchange,死信隊(duì)列交換機(jī))
args.put(x-dead-letter-routing-key,死信routeKey)
args.put(x-message-ttl,隊(duì)列里面的消息最大存活時(shí)間) 
//申明一個(gè)普通隊(duì)列,并且給這個(gè)普通隊(duì)里綁定一個(gè)死信隊(duì)列。當(dāng)消息過(guò)期就會(huì)轉(zhuǎn)到死信隊(duì)列里面去。
Queue queue = QueueBuilder.durable(queue).withArguments(args).build();

2、設(shè)置過(guò)期時(shí)間

目前有兩種方式可以設(shè)置消息的TTL。

第一種是通過(guò)隊(duì)列的屬性設(shè)置,隊(duì)列中的所有消息都有相同的過(guò)期時(shí)間。

第二種方法是對(duì)消息本身進(jìn)行單獨(dú)設(shè)置,每條消息的TTL可以不同。

如果兩種方法同時(shí)設(shè)置,則TTL以兩者之間較小的那個(gè)數(shù)值為準(zhǔn)。

消息在隊(duì)列中的生存時(shí)間一旦超過(guò)設(shè)置的TTL值時(shí)就會(huì)進(jìn)到死信。

1、通過(guò)隊(duì)列屬性設(shè)置消息過(guò)期時(shí)間

Map<String, Object> arguments = Maps.newHashMap();
//設(shè)置消息發(fā)送到隊(duì)列中在被丟棄之前可以存活的時(shí)間,單位:毫秒
arguments.put("x-message-ttl", 5000);
//聲明隊(duì)列
channel.queueDeclare(QUEUE_NAME, true, false, false, arguments);

2、發(fā)送消息的時(shí)候,對(duì)消息本身設(shè)定過(guò)期時(shí)間

MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
    @Override
    public Message postProcessMessage(Message message) throws AmqpException {
        message.getMessageProperties().setExpiration("5000");//設(shè)置消息多久沒(méi)有被消費(fèi)在過(guò)期。
        message.getMessageProperties().setContentEncoding("UTF-8");
        return message;
    }
};
rabbitTemplate.convertAndSend(exchangeName, routingKey, msg, messagePostProcessor);

上面底層代碼是:

AMQP.BasicProperties.Builder properties = MessageProperties.PERSISTENT_TEXT_PLAIN.builder();
properties.expiration("5000");//設(shè)置消息多久沒(méi)有被消費(fèi)在過(guò)期。
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, true, properties.build(), message.getBytes());

到此這篇關(guān)于關(guān)于Rabbitmq死信隊(duì)列及延時(shí)隊(duì)列的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Rabbitmq死信隊(duì)列延時(shí)隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis解決找不到get方法

    Mybatis解決找不到get方法

    這篇文章主要介紹了Mybatis解決找不到get方法問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java提效神器Stream的一些冷門(mén)技巧匯總

    Java提效神器Stream的一些冷門(mén)技巧匯總

    這篇文章主要給大家介紹了關(guān)于Java提效神器Stream的一些冷門(mén)技巧,Stream是java對(duì)集合操作的優(yōu)化,相較于迭代器,使用Stream的速度非常快,并且它支持并行方式處理集合中的數(shù)據(jù),默認(rèn)情況能充分利用cpu的資源,需要的朋友可以參考下
    2021-07-07
  • HttpClient實(shí)現(xiàn)調(diào)用外部項(xiàng)目接口工具類(lèi)的示例

    HttpClient實(shí)現(xiàn)調(diào)用外部項(xiàng)目接口工具類(lèi)的示例

    下面小編就為大家?guī)?lái)一篇HttpClient實(shí)現(xiàn)調(diào)用外部項(xiàng)目接口工具類(lèi)的示例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Java使用反射來(lái)獲取泛型信息示例

    Java使用反射來(lái)獲取泛型信息示例

    這篇文章主要介紹了Java使用反射來(lái)獲取泛型信息,結(jié)合實(shí)例形式分析了java基于反射操作泛型信息的相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-07-07
  • Java Set集合及其子類(lèi)HashSet與LinkedHashSet詳解

    Java Set集合及其子類(lèi)HashSet與LinkedHashSet詳解

    這篇文章主要介紹了Java Set集合及其子類(lèi)HashSet與LinkedHashSet詳解,文章通過(guò)Set集合存儲(chǔ)原理展開(kāi)文章主題相關(guān)介紹,感興趣的小伙伴可以參考一下
    2022-06-06
  • 劍指Offer之Java算法習(xí)題精講字符串與二叉搜索樹(shù)

    劍指Offer之Java算法習(xí)題精講字符串與二叉搜索樹(shù)

    跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化
    2022-03-03
  • Spring?AOP概念及原理解析

    Spring?AOP概念及原理解析

    這篇文章主要介紹了Spring?AOP概念及原理?,通過(guò)使用?Spring?AOP?實(shí)現(xiàn)日志管理,我們可以將日志記錄的邏輯從業(yè)務(wù)邏輯中分離出來(lái),簡(jiǎn)化了代碼的維護(hù),需要的朋友可以參考下
    2024-07-07
  • JAVA多線程中join()方法的使用方法

    JAVA多線程中join()方法的使用方法

    雖然關(guān)于討論線程join()方法的博客已經(jīng)非常極其特別多了,但是前幾天我有一個(gè)困惑卻沒(méi)有能夠得到詳細(xì)解釋?zhuān)?dāng)系統(tǒng)中正在運(yùn)行多個(gè)線程時(shí),join()到底是暫停了哪些線程,所以本文詳細(xì)解釋一下希望能幫助到和我有相同困惑的同學(xué)
    2021-05-05
  • Spring Security Oauth2.0認(rèn)證授權(quán)教程

    Spring Security Oauth2.0認(rèn)證授權(quán)教程

    Spring Security實(shí)現(xiàn)用戶認(rèn)證、會(huì)話管理及授權(quán),支持Token等多方式,OAuth2.0用于分布式系統(tǒng)統(tǒng)一認(rèn)證,網(wǎng)關(guān)解析令牌并轉(zhuǎn)發(fā)請(qǐng)求
    2025-07-07
  • springboot實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    springboot實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07

最新評(píng)論

宜川县| 榕江县| 南投市| 同江市| 嫩江县| 逊克县| 昌图县| 收藏| 南漳县| 泌阳县| 丹阳市| 沙洋县| 定陶县| 临武县| 洛隆县| 民丰县| 广西| 清水河县| 司法| 镶黄旗| 尼勒克县| 米脂县| 两当县| 上栗县| 博乐市| 维西| 墨竹工卡县| 罗江县| 浑源县| 广汉市| 西乌珠穆沁旗| 敖汉旗| 桃江县| 达日县| 普兰店市| 宁明县| 衡南县| 称多县| 清水河县| 孝感市| 华容县|