Per favore aiutami a trovare il mio fraintendimento.App Engine, transazioni e idempotency
Sto scrivendo un gioco di ruolo su App Engine. Alcune azioni che il giocatore prende consumano una certa statistica. Se la statistica raggiunge lo zero, il giocatore non può più eseguire azioni. Ho iniziato a preoccuparmi di imbrogliare i giocatori, però - cosa succede se un giocatore ha inviato due azioni molto velocemente, l'una accanto all'altra? Se il codice che decrementa la stat non è in una transazione, allora il giocatore ha la possibilità di eseguire l'azione due volte. Quindi, dovrei avvolgere il codice che decrementa le statistiche in una transazione, giusto? Fin qui tutto bene.
In GAE Python, però, abbiamo questo nel documentation:
Nota: Se la vostra applicazione riceve un'eccezione al momento della presentazione di una transazione, esso non significa sempre che l'operazione non è riuscita. È possibile ricevere le eccezioni Timeout, TransactionFailedError o InternalError nei casi in cui sono state eseguite transazioni e alla fine sarà applicato correttamente . Quando possibile, rendi le tue transazioni Datastore idempotenti così che se ripeti una transazione, il risultato finale sarà lo stesso.
Whoops. Ciò significa che la funzione Io correvo che assomiglia a questo:
def decrement(player_key, value=5):
player = Player.get(player_key)
player.stat -= value
player.put()
Beh, questo non funzionera ', perché la cosa non è idempotente, giusto? Se inserisco un ciclo di tentativi intorno ad esso (ho bisogno di in Python? Ho letto che non ho bisogno di SO ... ma non riesco a trovarlo nei documenti) potrebbe incrementare il valore due volte, destra? Dato che il mio codice può catturare un'eccezione ma il datastore ha ancora eseguito il commit dei dati ... eh? Come posso risolvere questo? È questo un caso in cui ho bisogno di distributed transactions? Davvero?
Beh, sì, ed è un buon punto ... ma prima di sparpagliare il mio codice con un gruppo di difficili da diagnosticare, difficili da riprodurre i bug mi piacerebbe sapere quale schema dovrei andare qui. –
Il pattern è sulla strada giusta, ma GAE presenta alcune sfumature frustranti che rendono difficile un'implementazione chirurgicamente precisa come questa. Nella mia esperienza con GAE, a volte vale la pena, ea volte no. –
@TravisWebb Non sono d'accordo. La sicurezza transazionale non è una "ottimizzazione prematura", né le collisioni tra le transazioni sono particolarmente improbabili. –