2009-05-10 42 views
7

Quel est un bon moyen de conserver l'état lors du redémarrage d'un processus planté?Comment puis-je restaurer l'état du processus après un plantage?

J'ai un superviseur dans une application OTP qui surveille plusieurs serveurs "sous-système". Par exemple, un sous-système «météo» génère un nouvel état météorologique toutes les 15 minutes et gère les requêtes relatives à l'état actuel de la météo. (Pensez au jeu de stand de limonade)

Si gen_server tombe en panne, je veux qu'il soit redémarré, mais il devrait être redémarré avec l'état météo le plus récent, pas un état arbitraire codé en dur dans init(). Il ne serait pas logique que l'état de simulation passe soudainement de «tempête de grêle» à «agréable et venteux» juste à cause de l'accident. J'hésite à utiliser mnesia ou ETS pour stocker l'état après chaque mise à jour en raison de la complexité ajoutée; Y a-t-il un moyen plus facile?

Répondre

4

Tant que cela doit juste être pendant l'exécution a suggérerait l'utilisation de ETS. La valeur est de loin supérieure à la complexité. L'API est simple et si vous travaillez avec des tables nommées, l'accès est également simple. Vous n'avez qu'à créer la table avant que votre serveur_gen soit démarré par le superviseur.

Deux - alternatives - plus complexes:

  • Construire une paire de processus, un pour le travail à faire, l'un pour le maintien de l'Etat. En raison de la simplicité de la seconde, il serait vraiment fiable.
  • Un vrai bêtise pourrait être l'échange de la spécification enfant du superviseur avec l'état actuel comme argument chaque fois que l'état change. (sourire) Non, je plaisante.
2

est-il un moyen plus facile?

lorsque le processus est mort, il envoie un message au superviseur contenant état de processus, de sorte que vous pouvez utiliser cette valeur pour stocker dans le superviseur (dans mnesia ou l'état du superviseur) et lorsque votre serveur démarre (en init de) il devez envoyer l'appel de synchronisation au superviseur pour obtenir la valeur d'état. Je n'ai pas de véritable exemple, mais j'espère que cela a du sens.

De toute façon je ne vois pas vraiment de problème pour stocker l'état en mnésie.

désolé mon anglais :)

+1

Le superviseur doit contenir le moins de logique possible et être responsable des redémarrages seulement. Un seul bogue dans cette logique pourrait entraîner le crash d'un sous-arbre entier. –