[Résolu] Quel technologie web pour mon problème ?

Bonjour à tous,

Pour un projet personnel, je suis actuellement dans une impasse: ayant l’habitude de coder en PHP/rails, je me suis habitué au paradigme de la non-persistance des données entre deux appels de pages (hormis l’utilisation d’une mémoire cache partagée telle que memcached ou apc pour php).

Or, il se trouve que je dois maintenant programmer une espèce de service (daemon) capable de répondre a des appels web, tout en ayant besoin d’une persistance de données entre deux appels (sans forcément pour autant nécessiter des appels base de données) et effectuant des tâches en arrière-plan (game loop) et des tâches différées.

J’ai quelques connaissances en Java et je sais par expérience que Java permet nativement la persistance de données (une servlet reste en permanence en mémoire, ayant pour effet que les champs statiques de la servlet restent stockés en mémoire).

J’aurai aussi besoin que ce service web puisse capable de communiquer via web-socket à ses clients, et puisse accéder à une base de données soit relationnelle (dans ce cas je sérializerai mes objets dans la base en dé-normalisant les champs nécessaire pour la recherche), mais de préférence No-SQL.

Sachant que mon serveur est sous linux, quelle framework / language pourrait convenir à mes besoins?

Note: pas de trolls ni de language wars, merci.

En gros tu voudrais faire du statefull, mais pourquoi éviter les appels à une base ?

Question sérieuse hein.

AngularJS fait ça non ? (j’ai peut-être dit une connerie)

est-ce que c’est la meme session entre 2 appels? genre passage d’une page à l’autre ou alors il peut y avoir 2 appels totalement distinct?

Je ne les évite pas pour les éviter, je les évite parce que je n’en aurai pas besoin “la plupart du temps”. En fait, le workflow (simplifié) est le suivant:

  1. N clients/joueurs se connectent à une instance de serveur
  2. pendant le cycle de vie de la partie, le serveur communique les états du jeu avec les clients, les clients fournissent au serveur les entrées (ie “je veux bouger a 4;5”). Dans cette partie là, aucun accès bdd n’est nécessaire, tout vit dans la mémoire du serveur.
  3. A la fin de la partie le serveur enregistre dans la base de données les vainqueurs, etc…

ouais ben c’est des sockets. node, servlets, … tu as le choix. quid de la deco d’un joueur ? tu gère comment ?

La présence du client est optionnelle quand au déroulement de la partie. Le joueur peut se déconnecter et se reconnecter à volonté, le reste de la partie est de toute façon géré par le serveur en “tâche de fond”. Et donc oui, je compte utiliser des web-sockets pour la communication client serveur.

Y’a une JSR et des exemples spring pour faire un cache.
Spring 4 embarque aussi de quoi servir des connexions websockets.

Maintenant, y’a peut être mieux ailleurs, mais coté Java, y’a ce qu’il faut.

Si t’es pas allergique au Javascript, NodeJS a l’air de répondre à tes besoins : websocket, démon “léger”, NoSQL, …

Après, il faut se faire à la programmation événementielle mais c’est pas insurmontable non plus.

Perso je partirais la dessus, combo nodejs+express+coffescript.

À priori je dirais java ou node.js

Quid d’un crash du serveur en cours de partie?
Quid d’un “scale out” avec plusieurs serveurs?
Quid de parties “longues” vs mémoire sur le serveur?

Bon, on va tenter node.js + socket.io parce que j’ai d’excellentes connaissances en Javascript et que plein de gens ici me l’ont recommandé.

Au début j’ai également pensé à AngularJS, mais bon, un serveur NodeJS devrait faire l’affaire, tu mets ce que tu veux devant après.

[quote=“JakeGrafton, post:11, topic: 55575”][/quote]

A priori, je sauvegarderai le game-state au crash, et permettrait de le recharger via un autre serveur.

[quote=“JakeGrafton, post:11, topic: 55575”][/quote]

Chaque serveur ne gère qu’une seule partie. J’ai un pool de serveurs disponibles. Si pas de serveur dispo, impossible de démarrer une partie.

[quote=“JakeGrafton, post:11, topic: 55575”][/quote]

Chaque partie est limitée dans le temps; et a priori, la mémoire devrait rester stable parce qu’il n’y a pas de création d’objets pendant la durée de vie d’une partie (seulement à l’initialisation de celle-ci).

[quote=“PERECil, post:14, topic: 55575”][/quote]

onCrash: function() {
   _saveState();
}

Sinon, pour avoir bossé sur les deux, je partirais sur du node. tellement moins lourd…

Après une petite review / tuto de Node.js c’est exactement ce qu’il me fallait. En plus c’est un language ou j’ai énormément d’expérience.

Merci la zone!

Ouep, avec du Node tu vas pas être décu.

[quote=“PERECil, post:14, topic: 55575”][/quote]

J’entendais plutôt par là “comment vas tu gérer les déconnexions?”. Vu qu’un serveur particulier gère une partie, il faut reballancer le joueur qui se reco sur le bon serveur… ou synchroniser les état des parties entre les serveurs.

Apres si je peux me permettre un bémol sur nodejs, ca bouge trop vite.
Enfin quand je l’avais testé, je m’etais retrouvé avec pleins de merdes parce que ca bougeait trop vite dans les versions.
Par contre si tu as le temps pour un retour je prends.

[quote=« Bussiere, post:18, topic: 55575 »][/quote]
C’est pas complètement faux oué. Un peu comme toutes les aides au développement (grunt, bower, etc), AngularJS, frameworks en tous genres. Ca va tellement vite que tu sais même plus quoi utiliser ou que quand tu reviens deux mois plus tard tout a changé :frowning: