<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試官問:訂單30分鐘未支付,則自動取消,該怎么實現(xiàn)?

          共 2069字,需瀏覽 5分鐘

           ·

          2023-03-11 04:26

          嶄新的辦公室,嶄新的會議室,窗明幾凈,地毯一塵不染,這樣舒適的工作環(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)驗心得,應該會對你以后的校招&求職或者工作學習有很大的幫助 ??。

          最后,把二哥的座右銘送給大家:沒有什么使我停留——除了目的,縱然岸旁有玫瑰、有綠蔭、有寧靜的港灣,我是不系之舟。共勉 ??。

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

          瀏覽 153
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色婷婷一区二区三区久久午夜成人 | 大粗鸡巴久久久久 | 日韩口交无码 | 粉嫩小泬BBBB欣赏 | 五月天av伊人av |