RabbitMQ如何實現延遲佇列?

2021-07-26 22:53:58 字數 2470 閱讀 9804

延遲佇列儲存的物件肯定是對應的延遲訊息,所謂」延遲訊息」是指當訊息被傳送以後,並不想讓消費者立即拿到訊息,而是等待指定時間後,消費者才拿到這個訊息進行消費。

場景一:在訂單系統中,乙個使用者下單之後通常有30分鐘的時間進行支付,如果30分鐘之內沒有支付成功,那麼這個訂單將進行一場處理。這是就可以使用延遲佇列將訂單資訊傳送到延遲佇列。

場景二:使用者希望通過手機遠端遙控家裡的智慧型裝置在指定的時間進行工作。這時候就可以將使用者指令傳送到延遲佇列,當指令設定的時間到了再將指令推送到只能裝置。

amqp協議,以及rabbitmq本身沒有直接支援延遲佇列的功能,但是可以通過ttl和dlx模擬出延遲佇列的功能。

ttl(time to live)

rabbitmq可以針對queue和message設定 x-message-tt,來控制訊息的生存時間,如果超時,則訊息變為dead letter

rabbitmq針對佇列中的訊息過期時間有兩種方法可以設定。

如果同時使用,則訊息的過期時間以兩者之間ttl較小的那個數值為準。訊息在佇列的生存時間一旦超過設定的ttl值,就成為dead letter

詳細可以參考:rabbitmq之ttl(time-to-live 過期時間)

dlx (dead-letter-exchange)

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

佇列出現dead letter的情況有:

利用dlx,當訊息在乙個佇列中變成死信後,它能被重新publish到另乙個exchange。這時候訊息就可以重新被消費。

詳細可以參考:rabbitmq之死信佇列

首先建立2個exchange和2個queue:

channel.exchangedeclare("exchange_delay_begin", "direct", true);

channel.exchangedeclare("exchange_delay_done", "direct", true);

mapargs = new hashmap();

args.put("x-dead-letter-exchange", "exchange_delay_done");

channel.queuedeclare("queue_delay_begin", true, false, false, args);

channel.queuedeclare("queue_delay_done", true, false, false, null);

channel.queuebind("queue_delay_begin", "exchange_delay_begin", "delay");

channel.queuebind("queue_delay_done", "exchange_delay_done", "delay");

2. consumer端**:

queueingconsumer consumer = new queueingconsumer(channel);

channel.basicconsume("queue_delay_done", false, consumer);

while (true)

3. producer端**:設定訊息的延遲時間為1min。

amqp.basicproperties.builder builder = new amqp.basicproperties.builder();

builder.expiration("60000");//設定訊息ttl

builder.deliverymode(2);//設定訊息持久化

amqp.basicproperties properties = builder.build();

string message = string.valueof(new date());

channel.basicpublish("exchange_delay_begin","delay",properties,message.getbytes());

在建立完exchange和queue之後,首先執行consumer端的**,之後執行producer端的**,待producer傳送完畢之後,檢視consumer端的輸出:

receive msg time:tue feb 14 21:06:19 cst 2017, msg body:tue feb 14 21:05:19 cst 2017
可以看到延遲1min消費了相關訊息。大功告成~

rabbitmq 實現延遲佇列的兩種方式

rabbitmq之ttl(time-to-live 過期時間)

rabbitmq之死信佇列

如何用RabbitMQ實現延遲佇列

利用外掛程式實現延遲佇列 總結在jdk的juc工具包中,提供了一種延遲佇列delayqueue。延遲佇列用處非常廣泛,比如我們最常見的場景就是在網購或者外賣平台中發起乙個訂單,如果不付款,一般15分鐘後就會被關閉,這個直接用定時任務是不好實現的,因為每個使用者下單的時間並不確定,所以這時候就需要用到...

如何用RabbitMQ實現延遲佇列

在jdk的juc工具包中,提供了一種延遲佇列delayqueue。延遲佇列用處非常廣泛,比如我們最常見的場景就是在網購或者外賣平台中發起乙個訂單,如果不付款,一般15分鐘後就會被關閉,這個直接用定時任務是不好實現的,因為每個使用者下單的時間並不確定,所以這時候就需要用到延遲佇列。延遲佇列本身也是佇列...

rabbitmq實現延遲佇列

延遲佇列應用場景 使用者生成訂單之後,需要過一段時間校驗訂單的支付狀態,如果訂單仍未支付則需要及時地關閉訂單。使用者註冊成功之後,需要過一段時間比如一周後校驗使用者的使用情況,如果發現使用者活躍度較低,則傳送郵件或者簡訊來提醒使用者使用。延遲重試。比如消費者從佇列裡消費訊息時失敗了,但是想要延遲一段...