05-03-2012, 08:17 PM
Je vois trois façons de régler le problème.
Définir un temps minimal entre deux attaques
La plus simple est de créer un cooldown sur l'action d'attaque : on ne peut attaquer que si 10 secondes (par exemple) se sont écoulées depuis l'attaque précédente.
Utiliser un verrou d'attaquer
Définir un verrou d'attaque sur tes personnages : une chaîne aléatoire stockée dans une colonne
Le script va chercher l'utilisateur par son ID et son
Utiliser une librairie de queuing
Avec une librairie de queueing, tu empiles les demandes d'attaques et tes workers les dépilent, en vérifiant à chaque fois la possibilité d'effectuer l'action. Ici, la première fonctionnera mais pas la deuxième.
Bien sûr, ça nécessite du dédié.
Définir un temps minimal entre deux attaques
La plus simple est de créer un cooldown sur l'action d'attaque : on ne peut attaquer que si 10 secondes (par exemple) se sont écoulées depuis l'attaque précédente.
Utiliser un verrou d'attaquer
Définir un verrou d'attaque sur tes personnages : une chaîne aléatoire stockée dans une colonne
attack_lock
. Pour attaquer un joueur, on envoie une requête sur la page attack/:target_id/:target_attack_lock
.Le script va chercher l'utilisateur par son ID et son
attack_lock
. Dès que l'attaque commence, tu régénères la valeur de la colonne attack_lock
du joueur. Ainsi, lors de la seconde requête, aucun joueur ne correspondra au couple donné et l'action échouera.Utiliser une librairie de queuing
Avec une librairie de queueing, tu empiles les demandes d'attaques et tes workers les dépilent, en vérifiant à chaque fois la possibilité d'effectuer l'action. Ici, la première fonctionnera mais pas la deuxième.
Bien sûr, ça nécessite du dédié.