rabbitmq的延時佇列及其搭建

2021-10-25 02:16:18 字數 2283 閱讀 2404

4.1 延時佇列介紹

延時佇列即放置在該佇列裡面的訊息是不需要立即消費的,而是等待一段時間之後取出消費。

那麼,為什麼需要延遲消費呢?我們來看以下的場景

網上**下訂單後30分鐘後沒有完成支付,取消訂單(如:**、去哪兒網)

系統建立了預約之後,需要在預約時間到達前一小時提醒被預約的雙方參會

系統中的業務失敗之後,需要重試

這些場景都非常常見,我們可以思考,比如第二個需求,系統建立了預約之後,需要在預約時間到達前一小時提醒被預約的雙方參會。那麼一天之中肯定是會有很多個預約的,時間也是不一定的,假設現在有1點 2點 3點 三個預約,如何讓系統知道在當前時間等於0點 1點 2點給使用者傳送資訊呢,是不是需要乙個輪詢,一直去檢視所有的預約,比對當前的系統時間和預約提前一小時的時間是否相等呢?這樣做非常浪費資源而且輪詢的時間間隔不好控制。如果我們使用延時訊息佇列呢,我們在建立時把需要通知的預約放入訊息中介軟體中,並且設定該訊息的過期時間,等過期時間到達時再取出消費即可。

rabbitmq實現延時佇列一般而言有兩種形式:

第一種方式:利用兩個特性: time to live(ttl)、dead letter exchanges(dlx)[a佇列過期->**給b佇列]

第二種方式:利用rabbitmq中的外掛程式x-delay-message

4.2 ttl dlx實現延時佇列

4.2.1 ttl dlx介紹

ttlrabbitmq可以針對佇列設定x-expires(則佇列中所有的訊息都有相同的過期時間)或者針對message設定x-message-ttl(對訊息進行單獨設定,每條訊息ttl可以不同),來控制訊息的生存時間,如果超時(兩者同時設定以最先到期的時間為準),則訊息變為dead letter(死信)

dead letter exchanges(dlx)

rabbitmq的queue可以配置x-dead-letter-exchange和x-dead-letter-routing-key(可選)兩個引數,如果佇列內出現了dead letter,則按照這兩個引數重新路由**到指定的佇列。

x-dead-letter-exchange:出現dead letter之後將dead letter重新傳送到指定exchange

x-dead-letter-routing-key:出現dead letter之後將dead letter重新按照指定的routing-key傳送

demo搭建

spring:

name: springboot-demo

rabbitmq:

host:

192.168

.213

.129

port:

5672

password: guest

username: guest

建立延時佇列

@configuration

public

class

queueconfig

/** * 簡訊傳送佇列

* @return

*/@bean

public queue delaymessagequeue()

/***

* 建立交換機

* @return

*/@bean

public directexchange directexchange()

/***

* 交換機與佇列繫結

* @param messagequeue

* @param directexchange

* @return

*/@bean

public binding basicbinding

(queue messagequeue, directexchange directexchange)

}

建立監聽

@component

@rabbitlistener

(queues = queueconfig.queue_message)

public

class

messagelistener

}

編寫測試類

@springboottest

@runwith

(springrunner.

class

)public

class

rabbitmqtest})

; system.in.

read()

;}}

RabbitMQ實現延時佇列

rabbitmq實現延時佇列一般有兩種形式 第一種方式 利用兩個特性 time to live ttl dead letter exchanges dlx a訊息佇列過期 傳送給b佇列 第二種方式 利用rabbitmq的外掛程式x delay message rabbitmq可以針對佇列設定x ex...

mysql 延時佇列 rabbitmq 延時佇列

前言 某個產品 或者訂單,有個有效期 過了有效期要取消 方法一 寫個指令碼,用crontab 定時掃瞄 改變狀態 但是最低只能一分鐘 不適合 方法二 用swoole得毫秒定時器,每秒鐘去掃瞄表 明顯占用資源 mysql受不了 方法三 用rabbitmq延時佇列 一開始將其丟入mq 死信佇列,設定有效...

基於 rabbitmq 實現的延時佇列

雖然 rabbitmq 沒有延時佇列的功能,但是稍微變動一下也是可以實現的 存在乙個倒計時機制 time to live ttl 當到達時間點的時候會觸發乙個傳送訊息的事件 dead letter exchanges dlx 基於第一點,我利用的是訊息存在過期時間這一特性,訊息一旦過期就會變成dea...