Кто должен управлять транзакциями с помощью системы удаленных учетных записей на основе запросов / ответов HTTP post? - PullRequest
1 голос
/ 14 ноября 2011

У меня есть приложение, которое использует свою собственную базу данных, а также работает с удаленной системой учета через HTTP-запросы / ответы на основе HTTP. Я могу публиковать запросы на дебет и кредит 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) То же самое относится ко второму блоку захвата.

Пожалуйста, предложите лучшие практики для такого случая.

...