新人初來乍到,先謝謝觀看問題的人。下面開始說問題。
我現在要做一個類似奪寶類的東西
大概 業務需求是這樣的
比如一個手機價格是6800元,大家眾籌的方式進行購買,1元起底,1元就是1份。可以購買多份,買一份給一個code碼,code碼是隨機發放的,買多份就給多個code碼,眾籌夠6800以後開始倒計時開獎。支付滿商品的價格後立馬開始新的一期,買滿的商品開始倒計時等待開獎,開獎後從獎池中搖到一個號碼作為中獎使用者,要保證首頁的商品永遠可購買。(這也就是我下面為什麼做成使用者去觸發新一期的原因。)
我現在是這麼做的
所有商品的第一期商品的所有code碼是用指令碼產生的,存在redis裡面。整個購買分兩部分,第一部分提交購物車的商品伺服器返回給訂單號碼,第二部分用戶端提交訂單號碼進行支付操作,這個介面要及時的給使用者購買商品價格的code碼個數,比如一個使用者買了388份,就在支付完成的介面給388個code碼,因為使用者每次購買成功以後必須及時顯示購買的code碼,所以我把非同步排除掉了。我在這個介面中還會判斷某使用者是不是付完這個手機6888元開始倒計時的最後一個使用者。如果是,開始在邏輯裡面產生該商品新的一期,並且產生新的一期的code碼。沒有用樂觀鎖去做,用的悲觀鎖,在使用者進行購買的時候會把獎池裡的號碼鎖住,購買交易完成後再解鎖,如果沒有給號碼的話整個購買直接復原,拋出異常。(這樣貌似導致並發也不是很高,初期想法也是交給用戶端如果拿到異常的狀態多請求幾次)。
使用者在主介面在點購買時永遠一直是最新的一期的,所以暫時交給最後一個使用者去觸發了。感覺不太對勁。如果用非同步隊列做,就不能保證使用者在進行支付時及時的看到code碼。(能想到非要用非同步話就是用戶端進行打支付的第二部分的時候拆分成請求兩次,第一次去支付,第二次去請求訂單的code碼。但是這樣返回速度會慢。)求教大神的思路。
回複內容:
新人初來乍到,先謝謝觀看問題的人。下面開始說問題。
我現在要做一個類似奪寶類的東西
大概 業務需求是這樣的
比如一個手機價格是6800元,大家眾籌的方式進行購買,1元起底,1元就是1份。可以購買多份,買一份給一個code碼,code碼是隨機發放的,買多份就給多個code碼,眾籌夠6800以後開始倒計時開獎。支付滿商品的價格後立馬開始新的一期,買滿的商品開始倒計時等待開獎,開獎後從獎池中搖到一個號碼作為中獎使用者,要保證首頁的商品永遠可購買。(這也就是我下面為什麼做成使用者去觸發新一期的原因。)
我現在是這麼做的
所有商品的第一期商品的所有code碼是用指令碼產生的,存在redis裡面。整個購買分兩部分,第一部分提交購物車的商品伺服器返回給訂單號碼,第二部分用戶端提交訂單號碼進行支付操作,這個介面要及時的給使用者購買商品價格的code碼個數,比如一個使用者買了388份,就在支付完成的介面給388個code碼,因為使用者每次購買成功以後必須及時顯示購買的code碼,所以我把非同步排除掉了。我在這個介面中還會判斷某使用者是不是付完這個手機6888元開始倒計時的最後一個使用者。如果是,開始在邏輯裡面產生該商品新的一期,並且產生新的一期的code碼。沒有用樂觀鎖去做,用的悲觀鎖,在使用者進行購買的時候會把獎池裡的號碼鎖住,購買交易完成後再解鎖,如果沒有給號碼的話整個購買直接復原,拋出異常。(這樣貌似導致並發也不是很高,初期想法也是交給用戶端如果拿到異常的狀態多請求幾次)。
使用者在主介面在點購買時永遠一直是最新的一期的,所以暫時交給最後一個使用者去觸發了。感覺不太對勁。如果用非同步隊列做,就不能保證使用者在進行支付時及時的看到code碼。(能想到非要用非同步話就是用戶端進行打支付的第二部分的時候拆分成請求兩次,第一次去支付,第二次去請求訂單的code碼。但是這樣返回速度會慢。)求教大神的思路。
我理解這樣的,首先提到幾個關鍵性流程就是,下單,支付,發碼,下單其實是獨立的一個沒有支付的訂單完全可以不用去鎖碼,也就是說支付和發碼才是一個原子操作,然後分析並發,首先訂單的並發就隨便玩吧非同步同步全看你的並發是否已經到了令人髮指的地步否則的話訂單的調用後端系統的邏輯應該不會太耗時,然後支付和發碼才是關鍵,首先據我瞭解任何一個支付系統都是很多流程的基本都是非同步,然後您說的發碼不能及時看到的問題,其實如果並發不是太大就放在支付完去redis 隨機拿個code 無太大問題,但是如果說並發又是令人髮指我有一個使用者體驗不太好的想法不確定是否能適合,就是放開始支付之時支付非同步不管其結果先去拿個碼然後和這個訂單關聯起來發出來,當然如果這個非同步結果出來了,支付失敗的話碼收回放回去,這樣就會很快,然後有個疑問就是這個最後的抽獎環節應該是在所有碼發完了再開始的吧,所以我覺得前面的使用者購買還是能讓他們等等的,這樣才會有更多的驚喜嘛!能力有限只能理解到這裡,還有你們這玩意有點眾籌賭博的意思嘛!挺好的一想法蠻厲害的
我做過類似的。我是搶完之後自動進入下一期,你為什麼不採用memcache鎖呢