狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

深入剖析如何設(shè)計(jì)訂單超時(shí)自動(dòng)取消的功能

freeflydom
2024年2月27日 9:9 本文熱度 1403

我們?cè)诿缊F(tuán) APP 下單,假如沒(méi)有立即支付,進(jìn)入訂單詳情會(huì)顯示倒計(jì)時(shí),如果超過(guò)支付時(shí)間,訂單就會(huì)被自動(dòng)取消。

這篇文章,筆者想以架構(gòu)師的視角,深入剖析如何設(shè)計(jì)訂單超時(shí)自動(dòng)取消的功能。

1 定時(shí)任務(wù)

首先,我們非常自然的想到定時(shí)任務(wù)的方案。

方案流程:

  1. 每隔 30 秒查詢數(shù)據(jù)庫(kù),取出最近的 N 條未支付的訂單。

  2. 遍歷查詢出來(lái)的訂單列表,判斷當(dāng)前時(shí)間減去訂單的創(chuàng)建時(shí)間是否超過(guò)了支付超時(shí)時(shí)間,如果超時(shí)則對(duì)該訂單執(zhí)行取消操作。

這種方案會(huì)間隔對(duì)數(shù)據(jù)庫(kù)造成一定的 IO 壓力,但工程實(shí)現(xiàn)相對(duì)簡(jiǎn)單。

網(wǎng)上有很多的定時(shí)任務(wù)實(shí)現(xiàn)策略,我們可以簡(jiǎn)單劃分為單機(jī)版集群版

筆者曾負(fù)責(zé)過(guò)彩票訂單、專(zhuān)車(chē)訂單等業(yè)務(wù),在這些業(yè)務(wù)場(chǎng)景里,都沒(méi)有使用單機(jī)版定時(shí)任務(wù)。

因?yàn)闃I(yè)務(wù)系統(tǒng)都是集群部署,假如使用單機(jī)版模式,可能出現(xiàn)多臺(tái)不同機(jī)器實(shí)例同時(shí)執(zhí)行任務(wù)的風(fēng)險(xiǎn)。

雖然我們可以通過(guò)加鎖的方式適當(dāng)規(guī)避,從架構(gòu)設(shè)計(jì)的角度但總是不夠優(yōu)雅。

接下來(lái),筆者會(huì)介紹親身經(jīng)歷的三種集群定時(shí)任務(wù)。

01、 Quartz + JDBCJobStore

Quartz 是一款 Java 開(kāi)源任務(wù)調(diào)度框架,它支持集群模式。

圖中,Quartz 的集群模式需要在數(shù)據(jù)庫(kù)中添加11張表,對(duì)業(yè)務(wù)系統(tǒng)有一定的侵入性。

筆者曾經(jīng)服務(wù)的一家彩票公司,訂單調(diào)度中心就是使用 Quartz 的集群模式,實(shí)現(xiàn)日均百萬(wàn)訂單的調(diào)度處理。

需要特別注意的是:

基于底層數(shù)據(jù)庫(kù)悲觀鎖的機(jī)制, Quartz 的集群模式性能并不高,假如執(zhí)行頻率高的任務(wù)數(shù)超過(guò)一定數(shù)量級(jí),可能存在一定的問(wèn)題。

02、 Elastic-Job

ElasticJob 定位為輕量級(jí)無(wú)中心化解決方案,使用 jar 的形式提供分布式任務(wù)的協(xié)調(diào)服務(wù)。

ElasticJob 從本質(zhì)上來(lái)講 ,底層任務(wù)調(diào)度還是通過(guò) Quartz ,它的優(yōu)勢(shì)在于可以依賴(lài) Zookeeper 這個(gè)大殺器 ,將任務(wù)通過(guò)負(fù)載均衡算法分配給應(yīng)用內(nèi)的 Quartz Scheduler 容器,

舉例:應(yīng)用A有五個(gè)任務(wù)需要執(zhí)行,分別是 A,B,C,D,E。任務(wù)E需要分成四個(gè)子任務(wù),應(yīng)用部署在兩臺(tái)機(jī)器上。

圖中,應(yīng)用 A 在啟動(dòng)后, 5個(gè)任務(wù)通過(guò) Zookeeper 協(xié)調(diào)后被分配到兩臺(tái)機(jī)器上,通過(guò) Quartz Scheduler 分開(kāi)執(zhí)行不同的任務(wù)。

相比 Quartz 集群模式,ElasticJob 的可擴(kuò)展性更高,同時(shí)性能也更好。

但是 ElasticJob 的控制臺(tái)非常粗糙,主要原因還是基于它的實(shí)現(xiàn)機(jī)制 (Quartz + zookeeper),所以 ElasticJob 更多的還是定位于框架,而不是一個(gè)調(diào)度平臺(tái)

03、XXL-JOB

XXL-JOB 是一個(gè)使用最廣泛的分布式任務(wù)調(diào)度平臺(tái)

業(yè)務(wù)系統(tǒng)和調(diào)度平臺(tái)分開(kāi)部署,我們?cè)谡{(diào)度中心上配置應(yīng)用以及其定時(shí)任務(wù),當(dāng)任務(wù)需要執(zhí)行時(shí),調(diào)度平臺(tái)會(huì)觸發(fā)業(yè)務(wù)系統(tǒng)的任務(wù),業(yè)務(wù)系統(tǒng)執(zhí)行完任務(wù)之后,反饋給調(diào)度平臺(tái)任務(wù)執(zhí)行的結(jié)果。

業(yè)務(wù)系統(tǒng)和調(diào)度平臺(tái)都可以水平擴(kuò)展實(shí)現(xiàn)高可用,同時(shí)在調(diào)度平臺(tái)可以配置靈活的調(diào)度策略(比如重試機(jī)制等)。

筆者非常認(rèn)可這種模式。很多公司比如神州專(zhuān)車(chē)、美團(tuán)都有自己自研的任務(wù)調(diào)度平臺(tái)。這種模式非常適合多團(tuán)隊(duì)協(xié)作,便于調(diào)度任務(wù)的統(tǒng)一管理。

2 延時(shí)消息

延時(shí)消息是一種非常優(yōu)雅的模式。訂單服務(wù)生成訂單后,發(fā)送一條延時(shí)消息到消息隊(duì)列。消息隊(duì)列在消息到達(dá)支付過(guò)期時(shí)間時(shí),將消息投遞給消費(fèi)者,執(zhí)行取消訂單的邏輯。

延時(shí)消息有三種技術(shù)選型:

1、消息隊(duì)列 RocketMQ

RocketMQ 4.X 版本默認(rèn)支持 18 個(gè) level 的延遲消息, 通過(guò) broker 端的 messageDelayLevel 配置項(xiàng)確定的。

RocketMQ 5.X 版本支持任意時(shí)刻延遲消息,客戶端在構(gòu)造消息時(shí)提供了 3 個(gè) API 來(lái)指定延遲時(shí)間或定時(shí)時(shí)間。

2、自研延遲服務(wù)

基于 RocketMQ 4 內(nèi)置的延遲消息只能支持幾個(gè)固定的延遲級(jí)別,快手、滴滴開(kāi)發(fā)了單獨(dú)的 Delay Server 來(lái)調(diào)度延遲消息。

上圖這個(gè)結(jié)構(gòu)沒(méi)有直接將延遲消息發(fā)到 Delay Server,而是更換 Topic 以后存入 RocketMQ。這樣的好處是可以復(fù)用現(xiàn)有的消息發(fā)送接口(以及上面的所有擴(kuò)展能力)。對(duì)業(yè)務(wù)來(lái)說(shuō),只需要在構(gòu)造消息的時(shí)候額外指定一個(gè)延遲時(shí)間字段即可,其它用法都不變。

自研單獨(dú)的 Delay Server 不僅可以適配 RocketMQ 4.X , 也可以適配 Kafka ,說(shuō)實(shí)話,這個(gè)是一個(gè)非常實(shí)用的方案。

3、Redis 延遲隊(duì)列

Redis 延遲隊(duì)列是一個(gè)輕量級(jí)的解決方案,開(kāi)源成熟的實(shí)現(xiàn)是 Redission 。

圖中,我們定義兩個(gè)集合:

1、zset 集合

生產(chǎn)者將任務(wù)信息發(fā)送到 zset 集合,value 是任務(wù)編號(hào),score 是任務(wù)執(zhí)行時(shí)間戳。

2、list 集合

守護(hù)線程檢測(cè) zset 集合中到期的任務(wù),若任務(wù)到期,將任務(wù)編號(hào)轉(zhuǎn)移到 list 集合 , 消費(fèi)者從 list 集合彈出任務(wù),并執(zhí)行任務(wù)邏輯。

筆者需要強(qiáng)調(diào)的是:

Redis 雖然可以實(shí)現(xiàn)延遲消息的功能,但 Redis 并不是真正意義上的消息隊(duì)列,在使用過(guò)程中還是有小概率會(huì)丟失消息。

3 并發(fā)口訣:一鎖二判三更新

不管我們使用定時(shí)任務(wù)還是延遲消息時(shí),不可避免的會(huì)遇到并發(fā)執(zhí)行任務(wù)的情況 (比如重復(fù)消費(fèi)、調(diào)度重試等)。

當(dāng)我們執(zhí)行任務(wù)時(shí),我們可以按照一鎖二判三更新這個(gè)口訣來(lái)處理。

  1. 鎖定當(dāng)前需要處理的訂單。

  2. 判斷訂單是否已經(jīng)更新過(guò)對(duì)應(yīng)狀態(tài)了

  3. 如果訂單之前沒(méi)有更新過(guò)狀態(tài)了,可以更新并完成相關(guān)業(yè)務(wù)邏輯,否則本次不能更新,也不能完成業(yè)務(wù)邏輯。

  4. 釋放當(dāng)前訂單的鎖。

4 總結(jié)

這篇文章,筆者總結(jié)了訂單超時(shí)自動(dòng)取消方案的兩種流派:定時(shí)任務(wù)延遲消息

1、定時(shí)任務(wù)

  1. 每隔 30 秒查詢數(shù)據(jù)庫(kù),取出最近的 N 條未支付的訂單。

  2. 遍歷查詢出來(lái)的訂單列表,判斷當(dāng)前時(shí)間減去訂單的創(chuàng)建時(shí)間是否超過(guò)了支付超時(shí)時(shí)間,如果超時(shí)則對(duì)該訂單執(zhí)行取消操作。

定時(shí)任務(wù)實(shí)現(xiàn)策略,我們可以簡(jiǎn)單劃分為單機(jī)版集群版

筆者并不認(rèn)可單機(jī)版,背八股文當(dāng)然可以,訂單自動(dòng)取消這個(gè)業(yè)務(wù)場(chǎng)景,生產(chǎn)環(huán)境還是要慎重。

集群版有三種方式:Quartz + JDBCJobStoreElastic-Job 、XXL-JOB 。

每種方式各有優(yōu)缺點(diǎn),因?yàn)樽匝羞^(guò)任務(wù)調(diào)度系統(tǒng)的緣故,筆者更傾向于任務(wù)調(diào)度平臺(tái) XXL-JOB 這種方式。

2、延遲消息

延時(shí)消息是一種非常優(yōu)雅的模式。訂單服務(wù)生成訂單后,發(fā)送一條延時(shí)消息到消息隊(duì)列。消息隊(duì)列在消息到達(dá)支付過(guò)期時(shí)間時(shí),將消息投遞給消費(fèi)者,執(zhí)行取消訂單的邏輯。

本文介紹了三種方式:消息隊(duì)列 RocketMQ自研延遲服務(wù)Redis 延遲隊(duì)列

假如技術(shù)團(tuán)隊(duì)基礎(chǔ)架構(gòu)能力很強(qiáng),筆者推薦使用 RocketMQ 或者自研延遲服務(wù)。

假如技術(shù)團(tuán)隊(duì)僅僅想用輕量級(jí)的實(shí)現(xiàn),可以選擇 Redis 延遲隊(duì)列。

不管是使用定時(shí)任務(wù)還是延遲消息,都需要考慮并發(fā)問(wèn)題,請(qǐng)記住一個(gè)簡(jiǎn)單的口訣:一鎖二判三更新

最后,沒(méi)有完美的技術(shù),只有最合適的技術(shù)

做技術(shù)選型時(shí),一定要結(jié)合業(yè)務(wù)場(chǎng)景,研發(fā)效率,運(yùn)維成本,技術(shù)儲(chǔ)備等因素,做出合理的選擇。


轉(zhuǎn)自博客園https://www.cnblogs.com/makemylife/p/18025701


該文章在 2024/2/27 9:10:23 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved