JeuWeb - Crée ton jeu par navigateur
Comment faire un CRON dynamique avec un serveur mutualisé? - 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 : Comment faire un CRON dynamique avec un serveur mutualisé? (/showthread.php?tid=6240)

Pages : 1 2 3 4 5


Comment faire un CRON dynamique avec un serveur mutualisé? - Argorate - 05-07-2012

Bonjour,

j'aurais besoin de mettre en place ce que j'appels des CRON dynamique sur mon serveur mutualisé.
J'entends par la de créer dynamiquement une tache CRON (qui vient donc déclenché un script à heure fixe donné) en fonction des actions des joueurs sur mon site.

Exemple: un joueur créer un bâtiment, j'aurais besoin de créer dynamiquement un CRON qui vienne finaliser la construction du bâtiment X heures après l'action du joueur. Bien sur la tache doit s'auto détruire une fois réalisé.


Pour l'instant cette façon de faire semble impossible à réaliser sur un mutu.

Quelqu'un a t-il trouver un moyen de contourner la chose? quel solution?


merci.


RE: Comment faire un CRON dynamique avec un serveur mutualisé? - Sephi-Chan - 05-07-2012

Pour information, ça s'appelle une tâche différée (delayed job en anglais) et ça se fait avec la commande at sur du Linux (alors que les cron se font via la commande cron).

Renseigne-toi auprès de ton hébergeur s'il propose un planificateur, je sais que OVH le fait. Sinon il faudra passer par un service tiers et je ne sais pas lesquels le font.



RE: Comment faire un CRON dynamique avec un serveur mutualisé? - srm - 05-07-2012

Et bien Sephi-Chan tu m'étonnes dans le mauvais sens du terme.
Tu réponds exactement à sa question, mais sans lui dire que c'est une très mauvaise façon de faire et de lui donner la bonne.

Donc Argorate, il ne faut pas procéder comme ça, car c'est crade.

Le mieux c'est d'avoir un cron qui tourne toutes les minutes et qui va lire une queue pour savoir les actions à traiter et le fait.


RE: Comment faire un CRON dynamique avec un serveur mutualisé? - Sephi-Chan - 05-07-2012

Je ne pense pas qu'il y ai de problème avec sa volumétrie. Le scheduler de at n'implique qu'un seul processus, et quand l'heure d'en lancer un arrive il exécute la commande voulue dans un autre processus et le termine quand la tâche est finie. Pas de quoi faire trembler un serveur, donc.


RE: Comment faire un CRON dynamique avec un serveur mutualisé? - Argorate - 05-07-2012

(05-07-2012, 11:35 AM)oxman a écrit : Et bien Sephi-Chan tu m'étonnes dans le mauvais sens du terme.
Tu réponds exactement à sa question, mais sans lui dire que c'est une très mauvaise façon de faire et de lui donner la bonne.

Donc Argorate, il ne faut pas procéder comme ça, car c'est crade.

Le mieux c'est d'avoir un cron qui tourne toutes les minutes et qui va lire une queue pour savoir les actions à traiter et le fait.

Je ne trouve pas cette méthode pertinente (dans mon cas), au contraire!

Non seulement tu fais un script 59 fois pour rien par heure lorsqu'il n'y a pas de construction, mais en plus c'est pas du temps réel avec un tel système! Un lag d'une minute n'est pas du tout tolérable (pour moi et surtout pour les joueurs^^).

En effet avec un cron toutes les minutes, tu as le risque que le joueurs viennent sur la page, que le cron soit passé une seconde trop tôt et que le bâtiment ne soit pas terminer alors que le joueur devrait le voir fini...

dans un tel cas, je risque de recevoir une montagne de poste sur le forum "Construction bug..." et ils auront raison à mon sens.

Donc c'est bien des taches planifié qu'il me faut.


RE: Comment faire un CRON dynamique avec un serveur mutualisé? - srm - 05-07-2012

Ok, c'est vrai que je connais rien en informatique, pardon :')


RE: Comment faire un CRON dynamique avec un serveur mutualisé? - Argorate - 05-07-2012

Grrrr... tu sais très bien que c'est pas ce que je dis!
Je t'explique pourquoi je ne pense pas que ça soit la bonne solution dans mon cas à moi, maintenant si tu as un contre-argument, n'hésite pas! Wink


RE: Comment faire un CRON dynamique avec un serveur mutualisé? - Astarion - 05-07-2012

(05-07-2012, 12:22 PM)Argorate a écrit : En effet avec un cron toutes les minutes, tu as le risque que le joueurs viennent sur la page, que le cron soit passé une seconde trop tôt et que le bâtiment ne soit pas terminer alors que le joueur devrait le voir fini...

Même avec une tache planifiée tu risques d'avoir ce genre de problème ...
Ta tache planifiée est prévue à 15:30:00, si ton joueur arrive sur ta page à 15:29:50 il ne verra pas le bâtiment finit, même s'il reste 10 secondes ou plus sur ta page (temps avant l'exécution de la tache planifiée)...

Donc quoiqu'il arrive, tu n'auras pas du temps réel... Si tu tiens vraiment au temps réel, il te faut un serveur de push (Node.js et Socket.io font très bien l'affaire) qui à heure donnée pousse la mise à jour de la page de ton joueur, et là tu auras du temps réel et ton joueur verra son bâtiment finit à 15:30:00 tapante !




RE: Comment faire un CRON dynamique avec un serveur mutualisé? - srm - 05-07-2012

(05-07-2012, 12:22 PM)Argorate a écrit :
(05-07-2012, 11:35 AM)oxman a écrit : Et bien Sephi-Chan tu m'étonnes dans le mauvais sens du terme.
Tu réponds exactement à sa question, mais sans lui dire que c'est une très mauvaise façon de faire et de lui donner la bonne.

Donc Argorate, il ne faut pas procéder comme ça, car c'est crade.

Le mieux c'est d'avoir un cron qui tourne toutes les minutes et qui va lire une queue pour savoir les actions à traiter et le fait.

Je ne trouve pas cette méthode pertinente (dans mon cas), au contraire!

Non seulement tu fais un script 59 fois pour rien par heure lorsqu'il n'y a pas de construction, mais en plus c'est pas du temps réel avec un tel système! Un lag d'une minute n'est pas du tout tolérable (pour moi et surtout pour les joueurs^^).

En effet avec un cron toutes les minutes, tu as le risque que le joueurs viennent sur la page, que le cron soit passé une seconde trop tôt et que le bâtiment ne soit pas terminer alors que le joueur devrait le voir fini...

dans un tel cas, je risque de recevoir une montagne de poste sur le forum "Construction bug..." et ils auront raison à mon sens.

Donc c'est bien des taches planifié qu'il me faut.

59 fois par heure il fait rien, pas forcément, mais il se peut qu'il fasse rien du tout très souvent oui.
Mais c'est pas bien grave, il fera quoi ? SELECT * FROM QUEUE et il quitte si il y a rien à faire.
Avec at de toute façon tu as le serveur atd qui tourne en continu non stop, donc bon ça change pas grand chose, là est pas le problème de toute façon.

Il n'y aura pas de lag, car tu ne dois pas te reposer sur la queue ou tout autre système que tu utilises. La queue sert à traiter les informations quand il n'y a personne de présent.

Si le joueur se connecte et va sur sa carte, tu dois checker à ce moment (quelque soit la solution utilisé, at, queue, ou autre) si les bâtiments sont finis ou non et aussi afficher le temps restant en le calculant à ce moment là. Si le bâtiment est finis bah tu affiches qu'il est terminé, donc le joueur ne le verra pas non terminé et tu vires de la queue le fait que le bâtiment était en construction.

De plus tu peux faire ça très simple, tu fais une classe ProcessQueuePlayer, et une classe ProcessQueue, le script qui tourne en cron toutes les 1mn va lancer la classe ProcessQueue pour traiter la queue, pour chaque ligne de joueur qu'elle trouve, elle fait ProcessQueuePlayer pour traiter la queue pour le joueur spécifique.

Du coup, quand le joueur se connecte sur le site, tu lances à chaque fois dans tes pages web la classe ProcessQueuePlayer qui ferait exactement le même traitement que le cron. Enfin à quelques détails près, comme le fait de ne pas envoyer de mail pour alerter de la fin de construction Wink

Si tu utilises at en plus tu vas avoir ce soucis là soulevé par les joueurs :
Pourquoi je reçois un mail qui me dit que la construction est terminé alors que j'étais connecté sur le site et je l'ai vu de mes yeux.


RE: Comment faire un CRON dynamique avec un serveur mutualisé? - Marc15 - 06-07-2012

(05-07-2012, 03:18 PM)Astarion a écrit :
(05-07-2012, 12:22 PM)Argorate a écrit : En effet avec un cron toutes les minutes, tu as le risque que le joueurs viennent sur la page, que le cron soit passé une seconde trop tôt et que le bâtiment ne soit pas terminer alors que le joueur devrait le voir fini...

Même avec une tache planifiée tu risques d'avoir ce genre de problème ...
Ta tache planifiée est prévue à 15:30:00, si ton joueur arrive sur ta page à 15:29:50 il ne verra pas le bâtiment finit, même s'il reste 10 secondes ou plus sur ta page (temps avant l'exécution de la tache planifiée)...

Donc quoiqu'il arrive, tu n'auras pas du temps réel... Si tu tiens vraiment au temps réel, il te faut un serveur de push (Node.js et Socket.io font très bien l'affaire) qui à heure donnée pousse la mise à jour de la page de ton joueur, et là tu auras du temps réel et ton joueur verra son bâtiment finit à 15:30:00 tapante !

Je crois que tu n'as pas compris le problème.

Le problème, c'est que si on vérifie à toutes les minutes les bâtiments qui doivent être terminés, alors il se pourrait qu'un bâtiment qui aurait dû être terminé à 19:34:45 soit en fait terminé seulement à 19:35:00 parce qu'il fallait attendre le cron.