我有一个应用程序,它使用自己的数据库,还通过基于 XML 的 http post requests/responses 与远程会计系统一起工作。我可以发布借记和贷记 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) 同样适用于第二个 catch 块。
请针对这种情况提出最佳做法。