JeuWeb - Crée ton jeu par navigateur
Travailler uniquement en RAM avec php et/ou ruby, c'est possible? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Travailler uniquement en RAM avec php et/ou ruby, c'est possible? (/showthread.php?tid=6723)

Pages : 1 2


Travailler uniquement en RAM avec php et/ou ruby, c'est possible? - Argorate - 19-03-2013

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.


RE: Travailler uniquement en RAM avec php et/ou ruby, c'est possible? - niahoo - 19-03-2013

Réponse courte : En PHP c'est mort, oublie. En ruby c'est possible.

Ah, et sans vouloir être vexant, si tu lisais un peu mieux les posts de tes topics tu aurais déjà trouvé ton bonheur :p

http://www.jeuweb.org/showthread.php?tid=9175&pid=117364#pid117364


RE: Travailler uniquement en RAM avec php et/ou ruby, c'est possible? - Sephi-Chan - 19-03-2013

(19-03-2013, 07:10 PM)niahoo a écrit : Ah, et sans vouloir être vexant, si tu lisais un peu mieux les posts de tes topics tu aurais déjà trouvé ton bonheur :p

http://www.jeuweb.org/showthread.php?tid=9175&pid=117364#pid117364



RE: Travailler uniquement en RAM avec php et/ou ruby, c'est possible? - Argorate - 19-03-2013

niahoo: va falloir être plus expressif, argumente pour php, développe pour ruby.

sephi: l'autre sujet ne parlais pas de cette aspect, si c'est le cas c'était implicite, dans ce cas je veux bien aussi une réponse de plus de deux lignes plz Smile


RE: Travailler uniquement en RAM avec php et/ou ruby, c'est possible? - Xenos - 19-03-2013

Il existe, en MySQL, un type de table qui est stocké uniquement en mémoire RAM (MEMORY), si c'est la rapidité (sans sécurité) que tu cherches, regarde ce genre de table. Si besoin, tu peux implémenter ton code de backup pour avoir une copie classique de la table.

Ta solution théorique ne résout pas le problème de concurrence. Imaginons le pseudo-code suivant:
Code :
Objet: 100 points de vie
Script1 : Objet : Récupérer les points de vie (100)
Script2 : Objet : Récupérer les points de vie (100)
Script1 : Enlever 50 points de vie
Script2 : Enlever 50 points de vie
Script2 : Sauver le résultat (50 pts de vie)
Script1 : Sauver le résultat (50 pts de vie)
Et là, c'est le drame... Les deux scripts ont chacun voulu enlever 50 points de vie, mais finalement, l'objet est encore vivant.

Pour éviter cela, ce n'est pas "RAM ou HDD?" qu'il faut se poser comme question, mais "Exclusion mutuelle?".
Le seul moyen d'empêcher ce problème de "synchronisation" est de passer par des COMMIT / ROLLBACK, qui "bloquent" les données le temps de faire le traitement. A ce moment là, ok, utiliser la RAM accélèrera le traitement, mais ce n'est pas le fait d'utiliser la RAM qui résoudra le soucis de synchronisation.

La dernière solution peut consister à utiliser des opérations atomiques, et insérer les calculs dans le "UPDATE" de la BDD (dans le cas du retrait de 50 pts de vie, au lieu de "SELECT... puis -50 pts de vie puis UPDATE...", il vaut mieux faire "UPDATE (points_vie-=50)...", qui est une opération atomique.


RE: Travailler uniquement en RAM avec php et/ou ruby, c'est possible? - Sephi-Chan - 19-03-2013

(19-03-2013, 08:35 PM)Argorate a écrit : niahoo: va falloir être plus expressif, argumente pour php, développe pour ruby.

sephi: l'autre sujet ne parlais pas de cette aspect, si c'est le cas c'était implicite, dans ce cas je veux bien aussi une réponse de plus de deux lignes plz Smile

Faire ce que tu veux faire implique d'avoir un processus qui tourne sans cesse afin d'y stocker l'état.

Ce script doit donc tourner en permanence et ne jamais planter. Si ça arrive, il doit être relancé et pouvoir récupérer un état sain (pas forcément celui au moment du plantage, puisque cet état n'était peut-être pas très sain s'il a conduit à un plantage). Ce processus doit pouvoir communiquer avec d'autres choses (pusher des données à des navigateurs, directement ou via un intermédiaire).

Pour toutes ces raisons, PHP peut rapidement être exclu : il n'y a pas de threads, ce qui rend l'exécution du script très fragile et l'empêche de faire plusieurs choses à la foi.

En Ruby, tu as des solutions comme Celluloid qui imitent le modèle d'acteurs de Erlang : des acteurs qui tournent en parallèle (chacun ayant son état) et qui s'envoient des messages.

Ça permet une bonne gestion de la concurrence (chaque acteur possède sa propre queue de messages) et une bonne tolérance à la faute (les composants peuvent être supervisés par d'autres composants qui peuvent les lancer/relancer).


RE: Travailler uniquement en RAM avec php et/ou ruby, c'est possible? - niahoo - 20-03-2013

Je connais pas l'exclusion mutuelle mais ça m'a l'air un peu relou à mettre en place. Avec erlang, j'ai un process qui représente un vaisseau par exemple. Si deux joueurs tirent en même temps sur mon vaisseau, les deux appels vont être traités chacun leur tour donc à la fin du premier, mon vaisseau aura sa vie diminuée (et éventuellement enregistré en base de données) avant de traiter le second appel.

Pour php ce que tu demande n'existe simplement pas. à la limite tu peux stocker des variables dans APC mais ça ne protège pas des race conditions.

Ou alors avoir un script PHP qui tourne en boucle et qui écoute sur un port mais la c'est nul car quitte à communiquer entre plusieurs processus, autant oublier PHP pour des long-running-process. Le seul avantage de PHP dans ce cas là c'est de pouvoir réutiliser le code de ton appli. Mais rien n'empêche ton long-running-process de lancer des scripts PHP.

Check celluloid à mon avis c'est le mieux.

Ah, et tu devrais aussi regarder Erlang juste pour ta culture perso, ça vaut le coup Smile


RE: Travailler uniquement en RAM avec php et/ou ruby, c'est possible? - Xenos - 20-03-2013

L'exclusion mutuelle, de base, c'est ca: faire en sorte que, pendant qu'un process traite l'objet, un autre process ne peut pas venir mettre son grain de sel: l'objet n'est traité que par un seul processus à la fois. Les processus sont alors dits en "exclusion mutuelle": l'exécution de l'un exclusion l'execution de tout autre processus pendant ce temps.
Processus est à prendre au sens large du terme: fonction, méthode, ou même simplement une ligne de code.

L'autre solution, pour éviter les problèmes de "collision", c'est de n'avoir que des opérations "atomiques", c'est à dire "fusionner" le SELECT et le UPDATE.


RE: Travailler uniquement en RAM avec php et/ou ruby, c'est possible? - Argorate - 20-03-2013

Empêcher que plusieurs script touche aux mêmes variables ce n'est pas une solution en soit, c'est faisable même en php, le problème de ça, c'est que tu bloques tout ton jeu qui doit "attendre" que les ressources soit dispo avant de poursuivre...

Pour ton exemple Xenos, tu as dis exactement pareil que sur mon exemple de DVO, donc je connais bien le problème, mais si tu es en RAM, tu n'a plus le pb puisque ton objet sera le même pour les deux scripts, donc même si tu ne peux pas affirmer que l'ordre de départ entre les 2 scripts sera conservé, tu es sur que les effets de l'un sera cumulé avec celui de l'autre.


RE: Travailler uniquement en RAM avec php et/ou ruby, c'est possible? - srm - 20-03-2013

Oula non, ça n'est pas aussi simple que ça ^^