使用延遲佇列處理失效訂單問題

2021-10-04 13:31:56 字數 1140 閱讀 3899

在處理訂單過程中,如果乙個訂單生成之後,在特定時間內(比如15分鐘)沒有付款,那麼我們就要刪除這一筆訂單,釋放佔據的貨物資源。在這種場景下,最直觀的做法就是寫乙個定時job, 每分鐘掃瞄一下資料庫的訂單表,如果訂單超過了15分鐘,那麼訂單狀態改為刪除,並且商品表數量要加1,因為剛剛刪除的訂單釋放了乙個商品。這樣會給資料庫造成很大的壓力,而且如果長時間都沒有過期的訂單,而job依然會每分鐘跑一次,浪費資源。

jdk的延時佇列delayqueue比較適應這種場景。延時佇列,最重要的特性就體現在它的延時屬性上,跟普通的佇列不一樣的是,普通佇列中的元素總是等著希望被早點取出處理,而延時佇列中的元素則是希望被在指定時間得到取出和處理,達到了規定的時間,則取出,沒有達到規定的時間,則不取出。具體的**邏輯如下。

1. 建立乙個專門的delayservice, 它包含乙個專門的延遲佇列容器delayqueue. 它實現了initializingbean介面,所以在初始化的時候,會執行afterpropertiesset方法,呼叫start方法,啟動乙個執行緒, 這個執行緒會不斷的從延遲佇列中取出超時的訊息,然後呼叫註冊的listener方法進行處理。take方法獲取並移除佇列首元素,如果佇列沒有過期元素則等待,為阻塞式。

2. 可以在orderservice中註冊對於超時訊息的處理邏輯,也可以在其他地方註冊,只要在容器初始化的時候,能把相應的listener注入到delayservice的例項中。在訂單超時後,這裡會拿到超時訂單的訂單號,然後去資料庫裡做相應的操作,autocancelorder為取消訂單,釋放相應的貨物。

3. 在使用者建立訂單的時候,會進行兩個操作,在資料庫中寫入訂單資訊,然後就是在延遲佇列容器中加入乙個訊息,這個訊息要包含有建立的這個訂單號碼。delayservice.add方法會把延遲訊息放入到容器中。

使用RabbitMQ實現延遲佇列

在專案中 1.使用者確認乙個訂單,若30分鐘之類沒有支付,則需要取消訂單,若用定時任務去掃瞄訂單表,第一,定時任務時間如何定義,有存在漏掃的風險,第二,訂單表資料龐大,掃瞄表非常消耗效能,這時候該功能可以引入rabbitmq延遲佇列來做 2.某條活動通知在指定的一天推送給使用者,可以用延遲佇列 延遲...

訊息佇列處理微信支付超時訂單

1.配置交換機 佇列 rabbitmqconfig 延時佇列交換機 注意這裡的交換機型別 customexchange return bean public customexchange delayexchange 延時佇列 return bean public queue delayorderqu...

延遲佇列 DelayQueue 使用與原始碼解析

當記憶體中有一堆的客戶資訊,需要實時移除vip到期的客戶的特權時有以下做法。以上做法2有現成的佇列可以使用,就是接下來要說的延遲佇列。是不是跟優先佇列很像。delayqueue其內部就聚合了乙個優先佇列。其實現了queue,collection,blockingqueue。這裡注意一點,因為dela...