2010-11-16 5 views
2

J'ai une question sur un projet que je devrais mettre en œuvre pour mon cours Distributed System.erlang question générale sur socket

Le projet consiste à concevoir et implémenter une bibliothèque qui fournit un service de multidiffusion fiable aux processus utilisateur. Tous les processus appartiennent à un groupe et un message est envoyé par un processus membre à tous les membres du groupe. L'expéditeur est exclu de la liste des destinataires.

Cela me semble assez facile à mettre en œuvre en Erlang, en raison de la structure de son message qui passe ... plus de points sont donnés si vous utilisez appel rpc au lieu de prises normales à base .. mise en œuvre

Maintenant, ma question est la : l'un des points obligatoires de ce projet nécessite que les prises ne soient pas maintenues ouvertes lorsqu'il n'y a pas de communication entre les processus ...

Notre cours se déroule en C, mais nous sommes libres d'utiliser la langue que nous aimons ... puis-je satisfaire cette contrainte en utilisant des nœuds erlang et des appels rpc?

merci d'avance

+1

Oui, vous pouvez satisfaire cette contrainte. –

Répondre

2

Oui. Le module rpc a même multicall, qui prend une liste de nœuds et fera exactement ce que vous avez décrit. Il ne tiendra pas vos prises ouvertes quand il ne les utilise pas non plus.

2

Malgré ce que disent les autres réponses, le comportement par défaut d'Erlang ne satisfait pas vos contraintes. Un réseau typique de nœuds Erlang utilisant la distribution Erlang restera connecté de manière dense (chaque nœud connecté à tous les autres nœuds) avec des sockets TCP ouverts même lorsque vous ne les utilisez pas. Vous devrez soit utiliser -connect_all false et gérer vous-même l'ouverture/la fermeture des connexions aux autres noeuds, soit vous devrez développer votre propre protocole de distribution. Je recommanderais ce dernier, surtout depuis que vous apprenez. L'astuce pour le rendre facile est d'utiliser term_to_binary et binary_to_term.

+0

Afaik '-Connect_all false' empêche juste qu'un noeud se connecte à tous les noeuds quand il rejoint un réseau. Une connexion une fois ouverte est toujours gardée ouverte 'pour toujours'. – ZeissS

+0

Bien sûr, faire -connect_all false ne résout pas le problème par lui-même. Vous devez également utiliser net_kernel: connect_node/1 et erlang: disconnect_node/1 stratégiquement. C'est ce que je voulais dire par "gérer l'ouverture/la fermeture des connexions à d'autres nœuds". –

Questions connexes