2012-05-03 2 views
1

Disons que j'ai 100 serveurs exécutant chacun un démon - appelons-le server - ce serveur est responsable de générer un thread pour chaque utilisateur de ce service particulier (disons 1000 threads par serveur). Chaque N secondes chaque thread fait quelque chose et obtient des informations pour cet utilisateur particulier (ce modèle de demande/réponse ne peut pas être modifié). Le problème que j'ai un est parfois un fil se bloque et arrête de faire quelque chose. J'ai besoin d'un moyen de savoir que les données des utilisateurs sont obsolètes et doivent être actualisées.Modèle de serveur distribué

La seule idée que j'ai est tous les 5N secondes ont le fil jour un enregistrement MySQL associé à cet utilisateur (une colonne last_scanned dans la table des utilisateurs), et un autre processus qui vérifie cette table toutes les 15N secondes, si la colonne last_scanned est pas en cours, redémarrez le fil.

+0

Lorsque le thread arrête de faire quelque chose, est-ce le comportement attendu ou est-ce dû à une erreur? – Jordan

+0

En raison d'une erreur - je devrais spécifier que le fil se bloque (et oui, je devrais également corriger l'erreur afin que cela n'arrive pas en premier lieu, mais laisse ignorer cela) – v0idless

Répondre

1

La manière générale de gérer cela est de faire en sorte que les unités d'exécution rapportent leur statut au démon du serveur. Si vous n'avez pas vu une mise à jour de statut dans les 5 dernières secondes, alors vous tuez le thread et en recommencez un autre.

Vous pouvez garder une trace des threads actifs que vous avez sélectionnés dans une liste, puis les parcourir de temps en temps pour déterminer leur état.

Vous devez bien sûr également corriger les erreurs dans votre programme qui provoquent la sortie prématurée des threads.

Des sorties prématurées et la destruction d'un thread peuvent également laisser votre programme dans un état inattendu, non atomique. Le démon du serveur doit probablement exécuter un processus de nettoyage qui garantit que tous les éléments de votre file d'attente ou ceux que vous utilisez pour déterminer la charge de travail sont réinitialisés après une certaine période d'inactivité.

+0

C'est certainement un meilleur modèle, mais ce serait se produire si le démon du serveur est mort (panne de courant, panne matérielle, etc.)? J'ai toujours l'impression qu'il doit y avoir une sorte de stockage persistant, donc si le démon du serveur meurt, il connaitrait les utilisateurs auxquels il tenait, ou les utilisateurs qui doivent être analysés. – v0idless

+0

J'ai supposé que vous aviez déjà une sorte de stockage persistant pour faire le travail. En général, les gens vont utiliser une file d'attente pour ce genre de chose. Vous pourriez vérifier RabbitMQ pour cela. – Jordan