Question

Je regardais les modules esclave / pool et cela semble similaire à ce que je vouloir, mais il semble aussi que j’ai un seul point d’échec dans mon application (si le nœud maître tombe en panne).

Le client dispose d'une liste de passerelles (par souci de repli, toutes ne le font pas). même chose) qui acceptent les connexions, et l’un est choisi parmi au hasard par le client. Lorsque le client se connecte, tous les nœuds sont examiné pour voir lequel est le moins chargé, puis l’adresse IP du moins Le serveur chargé est renvoyé au client. Le client alors se connecte à ce serveur et tout y est exécuté.

En résumé, je veux que tous les nœuds agissent comme les deux passerelles et traiter les demandes des clients. L’équilibrage de la charge n’est effectué que lorsque le le client se connecte initialement - tous les paquets réels et traités sur le " domicile " du client noeud.

Comment ferais-je cela?

Était-ce utile?

La solution

Je ne sais pas si ces modules ont déjà été mis en œuvre, mais ce que je peux dire, l’équilibrage de la charge est surestimé. Ce que je peux dire, c’est que le meilleur choix est de placer des emplois au hasard, sauf si vous en savez plus sur la charge à venir et dans la plupart des cas, ce n’est vraiment pas le cas. Ce que tu as écrit:

  

Lorsque le client se connecte, tous les noeuds sont examinés pour déterminer lequel est le moins chargé, puis l'adresse IP du serveur le moins chargé est renvoyée au client.

Comment savez-vous que tous les nœuds les moins chargés ne seront pas les plus chargés uniquement dans les prochaines ms? Comment savez-vous que tous ces nœuds très chargés que vous n'incluez pas dans la liste ne lâcheront pas la charge uniquement dans la prochaine ms? Vous ne pouvez vraiment pas le savoir sauf si vous avez un cas très rare.

Il suffit de mesurer (ou de calculer) les performances de votre nœud et de définir sa probabilité d'être choisi en fonction de celle-ci. Choisissez le nœud au hasard indépendamment de la charge actuelle. Utilisez ceci comme approche initiale. Lorsque vous le configurez, vous pouvez alors essayer de créer un algorithme plus sophistiqué. Je parie que ce sera un travail très dur pour battre cette approche initiale. Croyez-moi, très fort.

Modifier : pour être plus clair dans un détail subtil, je soutiens fortement que vous ne pouvez pas prédire la charge future de la charge actuelle ou historique, mais vous devez utiliser les connaissances relatives à la probabilité de durée des tâches et à la décomposition actuelle de la charge. la vie de la tâche. Ce travail est si difficile à réaliser.

Autres conseils

Le but d'un arbre de supervision est de gérer les processus, mais pas nécessairement les demandes en aval. Il n'y a aucune raison pour que vous ne puissiez pas utiliser un code différent pour envoyer des demandes directement aux membres de la liste des processus disponibles. Voir les fonctions pool: get_nodes ou pool: get_node () pour obtenir un moyen d'obtenir ces listes.

Vous pouvez laisser le module de pool gérer la gestion des processus (redémarrage, surveillance et élimination du traitement) et utiliser un autre module pour rediriger de manière transparente les demandes vers le pool de processus. Peut-être recherchez-vous des pools distribués? Il sera difficile de sortir du processus maître en erlang sans passer par les nœuds distribués. L'ensemble du système en cours d'exécution est à peu près un grand arbre de supervision.

Je me suis récemment rappelé du module pg qui vous permet de configurer des groupes de processus. les messages envoyés au groupe vont à tous les processus du groupe. Cela pourrait vous amener en partie à ce que vous voulez. vous devez écrire le code pour décider quel processus gère la demande mais vous obtiendrez un pool sans maître l’utilisant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top