面試官問:訂單30分鐘未支付,則自動取消,該怎么實現(xiàn)?
嶄新的辦公室,嶄新的會議室,窗明幾凈,地毯一塵不染,這樣舒適的工作環(huán)境,小二不由得期待了起來,要是這次面試能通過,我一定要好好干!
小二敲敲門,躡手躡腳進入了辦公室,態(tài)度虔誠,彎腰鞠躬,面露微笑,寒暄過后,一切就緒,面試官老王問了這么一個問題。
“看你簡歷上寫對電商購物比較熟悉,那在下單之后,通常會有一個倒計時,如果超過支付時間,訂單就會被自動取消?!?/p>
“你就來說說,你們項目中,訂單超時未支付自動取消都用了哪幾種方案?”
聽完老王這句話,小二心里狂喜,前幾天才在二哥公眾號看到這道面試題,這就碰上了!但小二依然表現(xiàn)出非常淡定的態(tài)度,娓娓道來。。。。。
以下是小二之前看到的解決方案,他可以說是倒背如流。
1.定時任務
這是最容易想到的辦法,定時任務去輪詢數(shù)據(jù)庫,取消即將超時的訂單。

定時任務實現(xiàn)方式有很多種,大概可以分為兩類:本地定時任務和分布式定時任務。

本地定時任務,適用于單機版的業(yè)務系統(tǒng),實現(xiàn)方式非常多樣:
永動機線程:開啟一個線程,通過sleep去完成定時,一些開源中間件的某些定時任務是通過這種方式實現(xiàn)的。 JDK Timer:JDK提供了Timer API,也提供了很多周期性的方法。 延遲線程池:JDK還提供了延遲線程池ScheduledExecutorService,API和Timer類似。 Spring Task:Sprig框架也提供了一些定時任務的實現(xiàn),使用起來更加簡單。 Quartz:Quartz框架更進一步,提供了可以動態(tài)配置的線程池。
分布式定時任務:適用于分布式的業(yè)務系統(tǒng),主要的實現(xiàn)框架有兩種:
xxl-job:大眾點評的許雪里開源的,一款基于MySQL的輕量級分布式定時任務框架。 elastic-job:當當開發(fā)的彈性分布式任務調(diào)度系統(tǒng),功能很強大,相對重一些。
定時任務實現(xiàn)的優(yōu)點是開發(fā)起來比較簡單,但是它也有一些缺點:
對數(shù)據(jù)庫的壓力很大,定時任務造成人為的波峰,執(zhí)行的時刻數(shù)據(jù)庫的壓力會陡增 計時不準,定時任務做不到非常精確的時間控制,比如半小時訂單過期,但是定時任務很難卡準這個點
2.被動取消
在文章開頭的那個倒計時器,大家覺得是怎么做的呢?一般是客戶端計時+服務端檢查。
什么意思呢?就是這個倒計時由客戶端去做,但是客戶端定時去服務端檢查,修正倒計時的時間。
那么,這個訂單超時自動取消,也可以由客戶端去做:
用戶留在收銀臺的時候,客戶端倒計時+主動查詢訂單狀態(tài),服務端每次都去檢查一下訂單是否超時、剩余時間 用戶每次進入訂單相關(guān)的頁面,查詢訂單的時候,服務端也檢查一下訂單是否超時

這種方式實現(xiàn)起來也比較簡單,但是它也有缺點:
依賴客戶端,如果客戶端不發(fā)起請求,訂單可能永遠沒法過期,一直占用庫存
當然,也可以被動取消+定時任務,通過定時任務去做兜底的操作。
3.延時消息
第三種方案,就是利用延時消息了,可以使用RocketMQ、RabbitMQ、Kafka的延時消息,消息發(fā)送后,有一定延時才會投遞。

我們用的就是這種,消息隊列采用的是RocketMQ,其實RocketMQ延時也是利用定時任務實現(xiàn)的。
使用延時消息的優(yōu)點是比較高效、好擴展,缺點是引入了新的技術(shù)組件,增加了復雜度。
4.其他方案
除了上面的三種,其實還有一些其它的方式,例如本地延遲隊列、時間輪算法、Redis過期監(jiān)聽……
但是我覺得,應該不會有人真考慮過在生產(chǎn)上使用這些方法。
后記:
時光飛逝,轉(zhuǎn)眼就來到了 2023年03月09 日,這已經(jīng)是小二入職新公司的第二個年頭,公司熬過了去年的寒冬后,就像如今的天氣一下,春暖花開,一切重回正軌,蒸蒸日上了起來。小二的學習勁頭也更足了些:“今年,我一定要更上一層樓才好呢!”
ending
一個人可以走得很快,但一群人才能走得更遠。二哥的編程星球已經(jīng)有 1900 多名 球友加入了,如果你也需要一個良好的學習環(huán)境,戳鏈接 ??加入我們吧。這是一個編程學習指南 + Java項目實戰(zhàn) + LeetCode刷題的私密圈子,你可以閱讀星球?qū)?、向二哥提問、幫你制定學習計劃、和球友一起打卡成長。
星球的知識圖譜里已經(jīng)沉淀了非常多優(yōu)質(zhì)的內(nèi)容,相信能幫助你走的更快、更穩(wěn)、更遠。

下面 ???? 是二哥近期分享的一些原創(chuàng)內(nèi)容,有在校學生黨的,也有在職工作黨的,多看看這些掏心掏肺的經(jīng)驗心得,應該會對你以后的校招&求職或者工作學習有很大的幫助 ??。
??:去B站實習了 ??:今天正式郵件 offer 下來了! ??:還是決定去華為了 ??:現(xiàn)在醒悟,還能搶救 ??:沖大廠秋招的一些良心建議 ??:華為 OD 29 萬,心動! ??:入職第一天,就想跑路了? ??:官宣:技術(shù)派上線了哈~ ??:國企這情況,,辭職去北京 ??:想去外企,該如何準備? ??:教練,我想學編程! ??:抓緊時間準備春招了! ??:雙非大二,沖 Google ??:想跳槽,我該如何準備?
最后,把二哥的座右銘送給大家:沒有什么使我停留——除了目的,縱然岸旁有玫瑰、有綠蔭、有寧靜的港灣,我是不系之舟。共勉 ??。

歡迎點擊左下角閱讀原文了解二哥的編程星球詳情,這可能是你學習求職路上最有含金量的一次點擊。
