大量過期訂單的處理問題


  1. 描述你的問題
    最近開發遇到一個大量訂單過期處理的問題,比如我拍了一個商品,半個小時之后他就不能付款了或者這個訂單應該被刪除掉。

第一、反應是crontab,但是考慮到每次都要去查mysql,感覺會影響效率;
第二、有人提示我用消息隊列rabbitmq,但是我看了半天感覺消息隊列好像沒啥用,我感覺邏輯還是拍下訂單的時候發送消息,然后php進程一直在那sleep?估計是我理解的不夠透徹,求大神解釋下相關流程。
第三、還有其他方法么?大神給個具體點的方案撒~

  1. 貼上相關代碼

  2. 貼上報錯信息

  3. 貼上相關截圖

  4. 已經嘗試過哪些方法仍然沒解決(附上相關鏈接)

 

回復內容:

  1. 描述你的問題
    最近開發遇到一個大量訂單過期處理的問題,比如我拍了一個商品,半個小時之后他就不能付款了或者這個訂單應該被刪除掉。

第一、反應是crontab,但是考慮到每次都要去查mysql,感覺會影響效率;
第二、有人提示我用消息隊列rabbitmq,但是我看了半天感覺消息隊列好像沒啥用,我感覺邏輯還是拍下訂單的時候發送消息,然后php進程一直在那sleep?估計是我理解的不夠透徹,求大神解釋下相關流程。
第三、還有其他方法么?大神給個具體點的方案撒~

  1. 貼上相關代碼

  2. 貼上報錯信息

  3. 貼上相關截圖

  4. 已經嘗試過哪些方法仍然沒解決(附上相關鏈接)

 

低成本解決方案

插入訂單的時候同時插入過期的時間

然后服務端用cli模式不斷查詢mysql數據庫就行啊

建立mysql過期時間的索引 並不會影響效率

 

如果對運營成本有要去的話,可以通過用戶觸發模式來實現:

  1. 在拍完商品的同時設定"過期時間" datetime。

  2. 用戶對該商品的任何更新都要同時更新"過期時間"。

  3. 每次用戶登錄后,讀取相關商品的時候通過php對比當前時間(如果對時間要求嚴格,建議用JS對比時間)跟商品過期時間。如果過期了,可以通過css標識當前商品已經過期。同事發送請求到rabbitmq隊列,因為讀取商品的時候已經得到了該產品的ID,所以最好的列隊信息是要包括這個ID。

  4. 后台有crontab定時讀取rabbitmq並且根據已知的ID批量生產刪除的mysql語句。

這種處理方法可以節省資源,減低無服務不必要的消耗,基本上就是一次讀取,一次刪除的數據庫操作而已。非常不建議逐條刪除,也建議逐條搜索mysql找出過期條目,最好是根據rabbitmq隊列生產批量刪除語句。

 

可以把訂單存進redis 給redis設置過期時間

 

過期時間加索引,然后定時任務去處理,每次更新固定條數就好了。比如定時腳本每次啟動,根據條件去查詢,每次查1000條,更新狀態為過期未付款,如果結果不足1000條或是沒有結果,就說明不用查下一次了。

 

你的問題是不是拍了后半小時沒付款就刪除,如果是的話,以下幾點思路你可以看看

  1. nosql,需要持久化的話就用redis,拍下就設定過期時間,到時間后自動刪除(這種情況就適合用nosql特性),你前台程序需要進行判斷。
    2.如果不允許用redis的話(就是用mysql類關系型數據庫咯),也是拍下的時候設定過期時間戳,然后在訂單相關頁面手動進行是否過期(如果過期時間和訂單在一個表,不會浪費資源啊,取多一個字段而已)

是我的理解錯了嗎,為什么需要crontab和消息隊列??

轉載:http://www.php.cn/php-weizijiaocheng-100728.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM