19-03-2013, 06:34 PM
Bonjour,
je lance ce sujet suite à diverses conversation concernant le temps réel et autres problèmes de concurrence.
Le constat :
Le problème de travailler avec une bdd, outre que ça ralentisse, il y a le problème de concurrence qui est décuplé de fait.
Le problème en détail :
Sur DVO j'ai donc une bdd.
Si deux attaques sont lancés simultanément sur le même joueur, j’aboutis fatalement à un problème de concurrence, puisque les deux scripts php de combat vont s’exécuter, chacun faisant leur SELECT à la bdd pour loader l'objet du joueur ciblé, puis vont tous les deux save() cet objet en fin de script. Mais en ignorant les modifications de l'autre script qui se fait en parallèle.
Du coup, c'est le script qui save() en dernier qui "écrase" le ou les autres.
La solution théorique :
Une solution serait donc de faire comme quand on travail avec un serveur Node et directement avec les objets.
Ainsi tous les scripts de l'appli vont tjs sur le même objet (en RAM). Lorsqu'on parle d'un joueur en particulier, à la différence de quand on a une bdd, on a plus le select, on va direct sur l'objet et il n'y a donc plus cette effet de concurrence. (je ne dis pas que ça règle tous les pb de concurrence, mais au moins ce cas là, qui arrive assez régulièrement dans mon cas).
De plus, cela serait plus rapide qu'un accès bdd.
La question :
Comment implémenter la théorie? Quel outils/méthodes permettent de se passer de la bdd?
j'aurais aimé 2 réponses indépendantes pour les langages suivants: PHP et Ruby.
Merci.
je lance ce sujet suite à diverses conversation concernant le temps réel et autres problèmes de concurrence.
Le constat :
Le problème de travailler avec une bdd, outre que ça ralentisse, il y a le problème de concurrence qui est décuplé de fait.
Le problème en détail :
Sur DVO j'ai donc une bdd.
Si deux attaques sont lancés simultanément sur le même joueur, j’aboutis fatalement à un problème de concurrence, puisque les deux scripts php de combat vont s’exécuter, chacun faisant leur SELECT à la bdd pour loader l'objet du joueur ciblé, puis vont tous les deux save() cet objet en fin de script. Mais en ignorant les modifications de l'autre script qui se fait en parallèle.
Du coup, c'est le script qui save() en dernier qui "écrase" le ou les autres.
La solution théorique :
Une solution serait donc de faire comme quand on travail avec un serveur Node et directement avec les objets.
Ainsi tous les scripts de l'appli vont tjs sur le même objet (en RAM). Lorsqu'on parle d'un joueur en particulier, à la différence de quand on a une bdd, on a plus le select, on va direct sur l'objet et il n'y a donc plus cette effet de concurrence. (je ne dis pas que ça règle tous les pb de concurrence, mais au moins ce cas là, qui arrive assez régulièrement dans mon cas).
De plus, cela serait plus rapide qu'un accès bdd.
La question :
Comment implémenter la théorie? Quel outils/méthodes permettent de se passer de la bdd?
j'aurais aimé 2 réponses indépendantes pour les langages suivants: PHP et Ruby.
Merci.
Dévotion, jeu multijoueur gratuit par navigateur de stratégie et de conquête
The Magic Institute, le jeu de magie médieval fantastique gratuit en ligne
Rapture Studio : créateur de divertissement pour tous
JePolitique.fr - débattons ensemble
JécrisLaConstitution.fr - ne laissons pas les Hommes aux pouvoirs écrire les règles du pouvoir
Je Deviens Citoyen (Association à but non lucratif)
The Magic Institute, le jeu de magie médieval fantastique gratuit en ligne
Rapture Studio : créateur de divertissement pour tous
JePolitique.fr - débattons ensemble
JécrisLaConstitution.fr - ne laissons pas les Hommes aux pouvoirs écrire les règles du pouvoir
Je Deviens Citoyen (Association à but non lucratif)