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

Langages de programmation Discussion :

avoir une seule instance d'une application sur un reseau


Sujet :

Langages de programmation

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 59
    Points : 45
    Points
    45
    Par défaut avoir une seule instance d'une application sur un reseau
    Bonjour,

    Nous developpons une famille d'applications deployée sur plusieurs postes d'un meme reseau.
    Une de ces applications ne doit pas être lancée plus d'une fois simultanément.

    L'algo actuel garantissant cette unicité est :
    Qd l'application demarre, elle regarde si elle trouve en base de données (unique pour tous les postes) des traces de vie récentes de l'application.
    * si oui, elle refuse de se lancer (message utilisateur)
    * si non, se lance normallement et ecrit des traces de vie regulierement en BD

    Cet algo n'est pas robuste puisque si 2 instances de l'application demarrent exactement en meme temps, elle vont pouvoir toutes les 2 s'executer normalement.

    J'avais pensé passer par une application "moniteur" s'executant sur la partie serveur a qui on pourrait demander l'autorisation de se lancer. Mais nos serveurs etant dupliqués (un serveur de secours), le developpement de ce "moniteur" n'est pas triviale...

    Avez-vous d'autres idées pour garantir l'instance unique de mon programme ?
    Par exemple, est-il possible de reserver une ressource reseau commune a plusieurs poste ? (en s'inspirant de l'ouverture d'une socket en local qui peut permettre de garantir une seule instance d'une application sur un meme poste)

    Si vous connaissez un meilleur endroit pour poster cette question, n'hesitez pas non plus

    Merci d'avance
    _pirBD_

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par pirbd Voir le message
    Avez-vous d'autres idées pour garantir l'instance unique de mon programme ?
    Plusieurs pistes :
    • Envoi d'une trame UDP broadcast (sorte de "ping") sur le réseau pour vérifier la présence (ou non) d'une autre instance.
      Peut être fait à plusieurs reprises : démarrage initial de l'application, et juste avant de démarrer les opérations. Une attente plus ou moins aléatoire (genre 100 à 1000 ms) peut permettre d'éviter les problèmes de démarrage simultané, bien que normalement les algos d'émission CSMA/CD du réseau devraient déjà permettre ça.

      La réponse à cette trame en diffusion peut contenir, notamment, l'adresse IP et/ou le nom d'ouverture de session (nom d'utilisateur, souvent) et/ou le nom de machine de façon à savoir QUI a ouvert l'application : cela évitera le problème inévitable de la personne qui ouvre l'application, verrouille son poste et part prendre un café en bloquant tout le monde...
    • Verrouillage d'un fichier sur un répertoire réseau, et/ou création en verrouillant l'écriture d'un fichier avec un nom connu à l'avance (les autres le voient en lecture seule, donc).
      Ce fichier peut contenir, en cas de création, les mêmes informations que la réponse au "ping" de façon à pouvoir "lire" dedans ces informations de localisation de l'instance active.
      L'atomicité de l'opération de création/lock est garantie par le système d'exploitation hôte du partage, donc pas de souci particulier.
    Personnellement, je ferais les deux en même temps histoire d'être tranquille :
    1. Un "ping" réseau (UDP broadcast) pour savoir si une instance est ouverte.
    2. Si oui, message à l'utilisateur + sortie.
    3. Si non, tentative de création d'un fichier réseau en accès exclusif.
    4. Si la création échoue, émission d'un "ping" réseau pour savoir qui a ouvert l'application et/ou lecture du fichier de verrouillage pour avoir les informations sur la personne ayant ouvert l'application. Bien sûr, avertissement à l'utilisateur et sortie ensuite.
    5. Si la création fonctionne, autoriser les opérations nominales.
    6. A la fermeture de l'application, destruction du fichier de lock.



    Pour les trames UDP, il faut et il suffit de créer un serveur dans ton application, ainsi qu'un client, et ceci le plus tôt possible. Tant qu'à faire, colle ça dans un thread histoire d'être certain que ça ne va pas être bloqué par une quelconque opération dans le thread principal.

    Prévoir le cas d'un crash de l'application, et donc la possibilité de supprimer le fichier de lock (ou de supprimer le verrouillage sur un fichier existant) de façon à permettre une nouvelle ouverture de l'application.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. avoir une seule instance de l'application
    Par doderic dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 25/10/2008, 11h38
  2. Réponses: 11
    Dernier message: 06/12/2005, 08h23

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