IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Serveur WebSocket avec Tyrus : code thread safe ?


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2019
    Messages : 2
    Par défaut Serveur WebSocket avec Tyrus : code thread safe ?
    Bonjour,

    Je viens de me lancer dans un petit projet personnel de jeu multijoueur avec un serveur Java WebSocket utilisant la lib Tyrus.

    J'ai de l'expérience dans le développement, mais très peu en Java et surtout pas en application multi-threading, alors je me pose des questions basiques :

    Chaque ServerEndPoint (la connexion avec le client WebSocket côté serveur) peut lire et écrire sur des objets qu'il partage avec les autres ServerEndPoint (les modèles du jeu, qui stockent l'état de la partie), et en regardant dans le débogueur je vois que chacun est susceptible de s'exécuter sur son propre thread "Grizzly-worker", donc à priori je devrais rendre mon code thread-safe, mais n'y connaissant rien je me dis que Tyrus gère peut-être ça de son côté, pour rendre les ServerEndPoint thread-safe ? Est-ce seulement possible ?

    J'ai fait quelques recherches mais rien trouvé de spécifique sur Tyrus, pour l'instant je lis de la doc sur les threads et je me demande comment je vais pouvoir gérer ça. Par exemple quand je créé un message pour le client en lisant les données d'un modèle, il faudrait empêcher un autre thread client de modifier ce modèle pendant la création du message. Actuellement chaque ServerEndPoint accède aux modèles, peut-être devrais-je ajouter un adaptateur entre les ServerEndPoint et les modèles, et qui synchronize les accès aux modèles ?

    Des questions de débutant je vous dis... mais Ô combien importantes, surtout que je risque de devoir refactoriser assez large si j'ai pas choisi la bonne conception...

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    Citation Envoyé par ChatCureuil Voir le message
    je me dis que Tyrus gère peut-être ça de son côté, pour rendre les ServerEndPoint thread-safe ? Est-ce seulement possible ?
    Possiblement si c'est lui qui fournit les classes des objets manipulés. Si c'est toi, alors non, il est impossible pour qui que ce soit d'autre que toi de les rendre thread-safe.

    Citation Envoyé par ChatCureuil Voir le message
    Actuellement chaque ServerEndPoint accède aux modèles, peut-être devrais-je ajouter un adaptateur entre les ServerEndPoint et les modèles, et qui synchronize les accès aux modèles ?
    C'est de loin le plus simple. Mais forcément ça marche pas quand on a des millions d'accès aux données en même temps.

    En général quand on veut passer à l'échelle il faut prévoir un modèle de cohérence concurrente des données. Mais bon ça dépend énormément de ce qu'on essaie de faire au juste.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2019
    Messages : 2
    Par défaut
    Merci pour la réponse. En effet ça paraît logique que le framework ne fasse rien pour moi, sinon ce serait un goulet d'étranglement et plus aucun intérêt d'utiliser les threads... Mais bon, n'y connaissant pas grand chose, ta réponse m'enlève les derniers doutes.

    Mon appli c'est du poker, donc jeu coup-par-coup, ça limite la casse niveau concurrence mais il y a une gestion des spectateurs, et c'est surtout eux, en se connectant, qui peuvent lire l'état de la table pendant qu'il est modifié par un joueur.
    Et il y a aussi les connections/déconnections, qui ajoutent/suppriment les joueurs à une collection qui est parcourue notamment pour l'envoie de quasi tous les messages serveur->client.
    Et une collection qui liste toutes les parties en cours, en ajoute de nouvelles pour le matchmaking, supprime les parties abandonnées, place les joueurs dans l'une ou l'autre...

    Après quelques lectures, pour les connections/déconnections j'ai l'impression que je pourrais m'en sortir en utilisant les collections thread-safe et en ajoutant un synchronized sur les méthodes addUser/removeUser.

    Et pour la sérialisation des messages, peut-être que je peux les faire construire entièrement par le modèle concerné dans une méthode synchronized ?
    Je ne suis pas sûr d'avoir tout compris sur les thread... ^^ Par exemple si GameModel a une méthode changeData() (qui change les données ^^) et une getGameState() (qui les récupère dans un objet Message), est-ce que mettre un synchronized sur getGameState() va mettre en attente les appels de changeData() ? Ou faut-il utiliser les méthodes wait() et notify() ?...

    Ma dernière grosse interrogation est au sujet des tests unitaires, comme je ne suis pas sûr de ce qui va merder dans mon appli tout ça me paraît un peu flou et j'aimerais mettre l'appli en défaut avec des tests, histoire de savoir ce que je corrige...
    Pour l'instant j'ai trouvé cet article, que je vais essayer d'appliquer à mon code...

    Je me permets de mettre le code de mon projet, si jamais des gens ont du temps pour regarder le code des autres et critiquer... Le ServerEndPoint est fr.chatcureuil.pokerplatform.socket.GameUser et les events qu'il envoie sont captés par des commandes (les mappings event->command sont dans fr.chatcureuil.pokerplatform.Mappings) comme fr.chatcureuil.pokerplatform.socket.command.GameUserConnectedCommand qui ajoute l'utilisateur dans une partie. Je vais sûrement commencer mes tests thread-safe par ici...

Discussions similaires

  1. se connecter à un serveur ftp avec du code VBA
    Par ch7787 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/07/2010, 18h19
  2. problème avec mon code pour accès au serveur ftp
    Par mimi51340 dans le forum Général Java
    Réponses: 1
    Dernier message: 03/03/2008, 23h24
  3. [Composant] Comment déclarer un code thread safe ?
    Par AiSpirit dans le forum Framework .NET
    Réponses: 5
    Dernier message: 26/08/2006, 11h37
  4. Code "Thread Safe" ?
    Par Neitsa dans le forum C++
    Réponses: 3
    Dernier message: 23/12/2005, 14h33
  5. Serveur/Client UDP: comment envoyer un fichier avec mon code
    Par danje dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 21/12/2005, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo