鍍金池/ 問答/Java  C#  Linux  數(shù)據(jù)庫/ 如何優(yōu)化并發(fā)情況下會(huì)員支付接口性能?

如何優(yōu)化并發(fā)情況下會(huì)員支付接口性能?

環(huán)境: ASP.NET, SQLSERVER, 服務(wù)器端單應(yīng)用,單數(shù)據(jù)庫。

場(chǎng)景:客戶端應(yīng)用調(diào)用后臺(tái)服務(wù)的會(huì)員支付扣款接口,完成會(huì)員折扣、賬單流水、會(huì)員余額變更等操作。

問題:在高峰期多客戶端調(diào)用該接口時(shí),出現(xiàn)部分調(diào)用處理時(shí)間長的問題。如正常接口調(diào)用在0.1s左右返回,但高峰時(shí)段(午市)1000多筆訂單中會(huì)出現(xiàn)20筆左右耗時(shí)長達(dá)幾秒甚至幾十秒。

因此,想請(qǐng)教下該如何優(yōu)化?

接口業(yè)務(wù)代碼:

支付扣款接口主要處理:查找會(huì)員、查詢優(yōu)惠信息、記錄賬單信息、記錄其他流水信息。
寫數(shù)據(jù)庫時(shí),但是將上述步驟返回的sql語句作為一個(gè)事務(wù)提交處理,同時(shí)為了保證訂單的唯一性,對(duì)寫操作加鎖。代碼大致如下:

// get sql objects

lock(obj){
    DB.Execute(sqlobjs);
}

自己能想到方案:

  1. 使lock的范圍盡可能的小,但現(xiàn)只對(duì)數(shù)據(jù)庫寫入加鎖,無法再縮小范圍;
  2. 減少sqlobjects的操作集,如只保留會(huì)員余額變動(dòng)、賬單記錄,其余的如賬單詳情使用其他的異步線程處理;

說明:因?yàn)榻涌趻煸谝淮笮虴RP應(yīng)用下,我懷疑是否在某個(gè)時(shí)間點(diǎn)由于ERP對(duì)數(shù)據(jù)庫的操作,導(dǎo)致該接口的SQL操作慢,但因?yàn)閷?duì)SQLServer性能監(jiān)測(cè)方面不是太熟悉,也沒個(gè)定論。

之前也沒有這種并發(fā)的程序設(shè)計(jì)經(jīng)驗(yàn),在此希望各位朋友能給點(diǎn)意見和推薦一些并發(fā)方面的閱讀資料。

在此感謝!

回答
編輯回答
笨尐豬

分布式失誤+微服務(wù)改造,大體的思路我覺得是這個(gè),具體的實(shí)施方案看業(yè)務(wù)
1.查詢會(huì)員或者優(yōu)惠信息等可以提請(qǐng)?zhí)幚矸胖糜趓edis或者內(nèi)存中,減少支付時(shí)的前置查詢時(shí)間,扣款時(shí)即可做到內(nèi)存計(jì)算扣款
2.后置的添加消費(fèi)記錄,增加積分,商品等相關(guān)信息的修改等可以引入消息隊(duì)列處理,由具體的服務(wù)去做
總的來說流程拆分,微服務(wù)改造,然后注意整個(gè)事務(wù),比如核心的支付扣款無法分布式處理,因?yàn)樾枰却劭罱Y(jié)果和事務(wù)確認(rèn),其它的還是可以拆分的

2017年6月17日 00:55
編輯回答
吃藕丑

讀的操作盡量放在內(nèi)存中,寫的操作能否用消息隊(duì)列抗一下呢?不知道后續(xù)會(huì)不會(huì)受到影響

2017年1月22日 13:05