描述你的問題
最近開發遇到一個大量訂單到期處理的問題,比如我拍了一個商品,半個小時之後他就不能付款了或者這個訂單應該被刪除掉。
第一、反應是crontab,但是考慮到每次都要去查mysql,感覺會影響效率;
第二、有人提示我用訊息佇列rabbitmq,但是我看了半天感覺訊息佇列好像沒啥用,我感覺邏輯還是拍下訂單的時候發送訊息,然後php進程一直在那sleep?估計是我理解的不夠透徹,求大神解釋下相關流程。
第三、還有其他方法嗎?大神給個具體點的方案撒~
貼上相關代碼
貼上報錯資訊
貼上相關
已經嘗試過哪些方法仍然沒解決(附上相關連結)
回複內容:
描述你的問題
最近開發遇到一個大量訂單到期處理的問題,比如我拍了一個商品,半個小時之後他就不能付款了或者這個訂單應該被刪除掉。
第一、反應是crontab,但是考慮到每次都要去查mysql,感覺會影響效率;
第二、有人提示我用訊息佇列rabbitmq,但是我看了半天感覺訊息佇列好像沒啥用,我感覺邏輯還是拍下訂單的時候發送訊息,然後php進程一直在那sleep?估計是我理解的不夠透徹,求大神解釋下相關流程。
第三、還有其他方法嗎?大神給個具體點的方案撒~
貼上相關代碼
貼上報錯資訊
貼上相關
已經嘗試過哪些方法仍然沒解決(附上相關連結)
低成本解決方案
插入訂單的時候同時插入到期的時間
然後服務端用cli模式不斷查詢mysql資料庫就行啊
建立mysql到期時間的索引 並不會影響效率
如果對運營成本有要去的話,可以通過使用者觸發模式來實現:
在拍完商品的同時設定"到期時間" datetime。
使用者對該商品的任何更新都要同時更新"到期時間"。
每次使用者登入後,讀取相關商品的時候通過php對比目前時間(如果對時間要求嚴格,建議用JS對比時間)跟商品到期時間。如果到期了,可以通過css標識當前商品已經到期。同事發送請求到rabbitmq隊列,因為讀取商品的時候已經得到了該產品的ID,所以最好的列隊資訊是要包括這個ID。
後台有crontab定時讀取rabbitmq並且根據已知的ID批量生產刪除的mysql語句。
這種處理方法可以節省資源,減低無服務不必要的消耗,基本上就是一次讀取,一次刪除的資料庫操作而已。非常不建議逐條刪除,也建議逐條搜尋mysql找出到期條目,最好是根據rabbitmq隊列生產大量刪除語句。
可以把訂單存進redis 給redis設定到期時間
到期時間加索引,然後定時任務去處理,每次更新固定條數就好了。比如定時指令碼每次啟動,根據條件去查詢,每次查1000條,更新狀態為到期未付款,如果結果不足1000條或是沒有結果,就說明不用查下一次了。
你的問題是不是拍了後半小時沒付款就刪除,如果是的話,以下幾點思路你可以看看
。
nosql,需要持久化的話就用redis,拍下就設定到期時間,到時間後自動刪除(這種情況就適合用nosql特性),你前景程式需要進行判斷。
2.如果不允許用redis的話(就是用mysql類別關係型資料庫咯),也是拍下的時候設定到期時間戳記,然後在訂單相關頁面手動進行是否到期(如果到期時間和訂單在一個表,不會浪費資源啊,取多一個欄位而已)
是我的理解錯了嗎,為什麼需要crontab和訊息佇列??