我有一个使用自己的数据库的应用程序,并且还可以通过基于XML的http post请求/响应来使用远程会计系统。 我可以发布借记和信用http发送请求。
当一些用户玩游戏时,我必须用一些赌注来奖励他,如果他赢了,我必须从中扣除胜利金额。由于它的http协议我实现了一些超时重试功能,但我想问一下当http请求很好并且我得到了响应时如何处理这个案例,但在那之后我的方面失败了?它就像分布式交易案例,但不一样:(...
一些伪代码更清晰:
public void handlePlay(double stake, double winAmount, int playerId) {
// post http stake request to remote account system
stakePlayer(playerId, stake); // this method post http request and on fail throws exception
int outcomeId;
// persists game outcome with stake and winAmount in local database
try {
outcomeId = persistOutcome(stake, winAmount, playerId);// this is in separate transaction
} catch(Excetion e) {
// send http post request to cancel stake request
cancelStake(stake, playerId);
}
if (winAmount > 0.0) { // send win amount http request
try {
winPlayer(winAmount, playerId); // debits winamount remote account system
} catch (Exception e) {
// send http post request to cancel stake request
cancelStake(stake, playerId);
// call method which deletes the outcome
deleteOutcome(outcomeId);
throw e;// finally this exception is thrown to the player
}
}
}
此代码中的问题是: 1)首先,如果persistOutcome(..)失败并且在catch子句中调用cancelStake,它可能无法发送取消请求(即使它具有重试算法)。 2)同样适用于第二个挡块。
请建议此类案例的最佳做法。