佇列同步 跨平台介面呼叫及值同步處理

2022-07-05 23:03:14 字數 2144 閱讀 4987

年前遇到這樣一種情況,記錄一下,以防後續出現同樣的錯誤,影響後續的處理及相容。

場景如下:

有幾個限制條件:

1. 需求指明不可以對店鋪分庫存,因為無法確認店鋪售賣哪個賣的多,哪個少;

2. 呼叫三方平台api新增商品時,sku量、庫存量、運費模板都有限制。庫存量不可超過1w;

3. 三方平台商品存在幾種狀態:待審核、審核待修改、審核通過(自動為上架)、審核拒絕、下架、上架、刪除等;

4. 三方平台api操作商品庫存資訊,僅且上架才可修改庫存,其餘狀態均異常【重點考慮】

5. 因自身平台商品,存在對應多平台情況,需要考慮不同平台商品的庫存一致性處理,避免超賣【重點考慮:試想一下能否絕對避免】;

前因:場景梳理

1.  由限制條件2得出,庫存超過需要額外同步;

2. 下單庫存變更,存在下單扣減、取消支付(下單)回增;

3. 運營後台增減庫存;

4. 運營手動更改三方店鋪庫存;

大略:

1. 實時同步

a. 以三方最高庫存值進行同步,多餘部分佇列補償;

b. 商品同步時,庫存全部為零,待三方店鋪商品上架後,在同步庫存;

2. 定時補償

a. 定時任務補償所有商品的店鋪庫存值,進行全量覆蓋的操作,避免直接操作三方庫存的情況發生;

詳細:

每次庫存變更,使用佇列(queue、redis ...)等方式,將變更增量加入佇列,增量值採用加鎖方式,保證庫存變更最終值的準確性;

如:可以使用redis中的set結構,對 [ 三方店鋪-商品id-skuid ] 進行快取變更資訊,再儲存對應的sku增量值

① 第一種方式::

如圖,使用單執行緒從佇列中 pop 除元素,進行執行處理,失敗則再次新增在隊中。

思考:若①方案中,某個資料執行異常,則一直在訪問之間處理,那麼這種方式就會一直耗費cpu資源,如何解決這種處理呢?

② 第二種方式:

分兩型別執行緒執行:

i:分發任務,將set中的member進行分發至佇列 ( queue ),判斷當前被分發的佇列是否為空且當前元素可以被操作,否需要睡眠n秒,是則繼續分發,注意執行緒執行冪等;

ii:執行任務,從佇列中poll / pop出元素,獲取並移除 [ 原子操作、加鎖保證或redis-lua指令碼 ] 增量值,呼叫三方庫存變更介面,失敗了,判斷原因,若為三方庫存少於扣減值,則清零,否則快取1h (不可操作標識),並再次新增佇列中,等待1h後的再次觸發;

③ 第三種方式:

思考 !!!

佇列調整 ?    方案調優 ?     超賣絕對避免  ?

1.  庫存分發時,注意冪等性; 

2. 分發執行時,避免死迴圈造成的cpu,需測試該操作對效能的影響,避免線上cpu爆滿的情況發生;

3. 可以合理利用thread.sleep(0l);  或者執行緒禮讓,避免cpu一直被占用的情況發生,從而導致cpu爆滿;

4. 可以使用redis - hash結構替換,hash中也存在increment的操作,也可以保障庫存增量變更時的值的最終一致;

使用 redis-set + string 可以避免對同一sku多次變更操作; hash結構同理

5. 活動前能否將涉及所有商品統一處理,減少異常情況發生;

6. 記錄庫存的變更流水,便於後續核對;

7. 除上述方式外,是否還有其他實現的可能,並且能夠避免超賣的風險?

whatever is worth doing is worth doing well  --- fn  

同步佇列序列介面QSPI的應用

1 qspi工作原理 qspi模組的結構如圖1所示。與spi相比,qspi結構最大的特點是以80位元組的ram取代了spi的傳送和接收資料暫存器。80位元組的ram分成3部分 16字的傳送ram,16字的接收ram和16位元組的命令ram。這3部分形成了具有16個qspi傳輸控制組的傳輸佇列 每個q...

AllJoyn 跨平台方法呼叫返回值為自定義型別

alljoyn 跨平台方法呼叫返回值為自定義型別 service端 public class mystruct busmethod replysignature sib mystruct catstruct string a,string b throws bu ception 方法實現 publi...

支付寶介面呼叫之同步通知與非同步通知

同步通知與非同步通知 同步通知返回的是使用者系統的通知頁面 非同步通知用來修改資料庫訂單狀態,成功必須返回 success 否則支付寶伺服器會不斷重發通知,直到超過24小時22分鐘。一般情況下,25小時以內完成8次通知 通知的間隔頻率一般是 4m,10m,10m,1h,2h,6h,15h 為什麼使用...