java實(shí)現(xiàn)Rabbitmq延遲隊(duì)列和惰性隊(duì)列
延遲隊(duì)列
當(dāng)一個(gè)隊(duì)列中的消息滿足下列情況之一,可以成為死信:
(1)消費(fèi)者使用basic.reject或basic.nack聲明消費(fèi)失敗,并且消息的requeue參數(shù)設(shè)置為false
(2)消息是一個(gè)過期消息,超時(shí)無人消費(fèi)
(3)要投遞的隊(duì)列消息堆積滿了,最早的消息可能成為死信
如果該隊(duì)列配置了dead-letter-exchange屬性,指定了一個(gè)交換機(jī),那么隊(duì)列中的死信就會(huì)投遞到這個(gè)交換機(jī)中,而這個(gè)交換機(jī)稱為死信交換機(jī)。
如何給隊(duì)列綁定死信交換機(jī)?
(1)給隊(duì)列設(shè)置dead-letter-exchange屬性,指定一個(gè)交換機(jī)
(2)給隊(duì)列設(shè)置dead-letter-routing-key屬性,設(shè)置死信交換機(jī)與死信隊(duì)列的RoutingKey
TTL(Time-To-Live)。如果一個(gè)隊(duì)列中的消息TTL結(jié)束仍未消費(fèi),則會(huì)變?yōu)樗佬?,TTL超時(shí)分為兩種情況:
(1)消息所在的隊(duì)列設(shè)置了存活時(shí)間
(2)消息本身設(shè)置了存活時(shí)間
利用TTL結(jié)合死信交換機(jī),實(shí)現(xiàn)了消息發(fā)出后,消費(fèi)者延遲收到消息的效果。這種消息模式就稱為延遲隊(duì)列模式。
延遲隊(duì)列的使用場(chǎng)景包括:
(1)延遲發(fā)送短信
(2)用戶下單,如果用戶在15 分鐘內(nèi)未支付,則自動(dòng)取消
(3)預(yù)約工作會(huì)議,20分鐘后自動(dòng)通知所有參會(huì)人員
DelayExchange的本質(zhì)還是官方的三種交換機(jī),只是添加了延遲功能。因此使用時(shí)只需要聲明一個(gè)交換機(jī),交換機(jī)的類型可以是任意類型,然后設(shè)定delayed屬性為true即可。
基于注解的方式:
@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "DelayQueue",durable = "true"),exchange = @Exchange(name = "delay-mq-exchange_B",delayed = "true"),key = "routingKey_delay")) @Component @Slf4j public class DirectConsumer { ...... }
基于Java代碼的方式:
@Bean public Exchange orderExchange(){ return ExchangeBuilder.topicExchange(RabbitMQExchanges.EXCHANGE_B.getExchange()).delayed().durable(true).build(); }
向delay為true的交換機(jī)中發(fā)送消息,一定要給消息添加一個(gè)header:x-delay,值為延遲的時(shí)間,單位為毫秒:
Message message= MessageBuilder.withBody(String.valueOf(content).getBytes(StandardCharsets.UTF_8)).setHeader("delay-one",500000).build();
惰性隊(duì)列
**消息堆積問題:**當(dāng)生產(chǎn)者發(fā)送消息的速度超過了消費(fèi)者處理消息的速度,就會(huì)導(dǎo)致隊(duì)列中的消息堆積,直到隊(duì)列存儲(chǔ)消息達(dá)到上限。最早接收到的消息,可能就會(huì)成為死信,會(huì)被丟棄,這就是消息堆積問題。
惰性隊(duì)列的特征如下:
(1)接收到消息后直接存入磁盤而非內(nèi)存
(2)消費(fèi)者要消費(fèi)消息時(shí)才會(huì)從磁盤中讀取并加載到內(nèi)存
(3)支持?jǐn)?shù)百萬條的消息存儲(chǔ)
而要設(shè)置一個(gè)隊(duì)列為惰性隊(duì)列,只需要在聲明隊(duì)列時(shí),指定x-queue-mode屬性為lazy即可。用SpringAMQP聲明惰性隊(duì)列分兩種方式:
基于注解的方式:
@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "DelayQueue",durable = "true",arguments = @Argument(name = "x-dead-letter-exchange",value = "lazy")),exchange = @Exchange(name = "delay-mq-exchange_B",delayed = "true"),key = "routingKey_delay"))
基于Java代碼的方式:
@Bean public Queue orderQueue(){ return QueueBuilder.durable(RabbitMQQueue.RABBIT_MQ_QUEUE_A.getQueue()).lazy().build(); }
到此這篇關(guān)于java實(shí)現(xiàn)Rabbitmq延遲隊(duì)列和惰性隊(duì)列的文章就介紹到這了,更多相關(guān)java Rabbitmq延遲隊(duì)列和惰性隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot+Security 發(fā)送短信驗(yàn)證碼的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot+Security 發(fā)送短信驗(yàn)證碼的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05Java 的雙重分發(fā)與 Visitor 模式實(shí)例詳解
這篇文章主要介紹了Java 的雙重分發(fā)與 Visitor 模式實(shí)例詳解,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07關(guān)于maven使用過程中無法導(dǎo)入依賴的一些總結(jié)
這篇文章主要介紹了關(guān)于maven使用過程中無法導(dǎo)入依賴的一些總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08SpringMVC中的ConversionServiceExposingInterceptor工具類解析
這篇文章主要介紹了SpringMVC中的ConversionServiceExposingInterceptor工具類解析,ConversionServiceExposingInterceptor是Spring MVC的一個(gè)HandlerInterceptor,用于向請(qǐng)求添加一個(gè)屬性,需要的朋友可以參考下2023-12-12swing中Tree與滾動(dòng)條用法實(shí)例分析
這篇文章主要介紹了swing中Tree與滾動(dòng)條用法,以實(shí)例形式分析了java基于swing實(shí)現(xiàn)圖形界面的使用技巧,需要的朋友可以參考下2015-09-09關(guān)于post請(qǐng)求內(nèi)容無法重復(fù)獲取的解決方法
這篇文章主要介紹了關(guān)于post請(qǐng)求內(nèi)容無法重復(fù)獲取的解決方法,文中通過代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-03-03關(guān)于注解式的分布式Elasticsearch的封裝案例
這篇文章主要介紹了關(guān)于注解式的分布式Elasticsearch的封裝案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01idea 創(chuàng)建properties配置文件的步驟
這篇文章主要介紹了idea 創(chuàng)建properties配置文件的步驟,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01