1

我有一个应用程序,它使用自己的数据库,还通过基于 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 块。

请针对这种情况提出最佳做法。

4

0 回答 0