2010-06-17 3 views
34

Je n'arrive pas à trouver une bonne explication du motif "Leader/Follower". Toutes les explications sont simplement refer to it in the context of some problem, ou are completely meaningless.Expliquer le motif "Leader/Follower"

Quelqu'un peut-il expliquer à la la mécanique comment ce modèle fonctionne, et pourquoi et comment il améliore les performances par rapport aux modèles d'E/S asynchrones plus traditionnels? Des exemples et des liens vers des diagrammes sont également appréciés.

Répondre

65

Comme vous avez pu le lire, le modèle se compose de 4 composants: ThreadPool, HandleSet, Handle, ConcreteEventHandler (implémente l'interface EventHandler).

Vous pouvez l'imaginer comme une station de taxi la nuit, où tous les conducteurs dorment sauf un, le chef. Le ThreadPool est une station gérant de nombreux threads - cabines.

Le leader attend un événement d'E/S sur le HandleSet, comme la manière dont un pilote attend un client. Quand un client arrive (sous la forme d'un Handle identifiant l'événement IO), le conducteur leader réveille un autre conducteur pour être le prochain leader et répond à la demande de son passager. Pendant qu'il conduit le client à l'adresse donnée (en appelant ConcreteEventHandler et en lui remettant Handle), le prochain leader peut desservir simultanément un autre passager. Lorsqu'un conducteur a terminé, il ramène son taxi à la gare et s'endort si la station n'est pas vide. Sinon, il devient le leader.

Les avantages de cette configuration sont les suivants:

  • pas de communication entre les fils sont nécessaires, aucune synchronisation, ni mémoire partagée (pas de serrures, mutex) sont nécessaires.
  • plus ConcreteEventHandlers peuvent être ajoutés sans affecter les autres EventHandler
  • réduit le temps d'attente en raison des multiples threads

Les inconvénients sont les suivants:

  • réseau complexe
  • IO peut être goulot d'étranglement
+5

+1 très bonne description. thead - cab driver, threadpool - station, événement - client, ... –

+9

Vous dites: "aucune communication entre les threads n'est nécessaire". Ce n'est pas vrai, il y a une communication entre les threads: il y a des handovers au thread suivant et il y a aussi un pool de threads en attente qui doit être synchronisé. – Michael

+0

+1 très bonne description. J'ai lu ceci en cours de lecture à ce sujet et j'ai compris cela au lieu d'une explication générale. – Kalle

0
+2

D'une manière ou d'une autre, j'ai raté ce * premier résultat de recherche Google *. Peut-être que je suis allergique aux liens PDF. Cependant, j'aimerais voir une réponse qui n'est pas un document avant d'accepter celui-là, cependant. :) –

+0

Peut-être copier la section 5 dans cette réponse? –

0

Je pense que l'exemple le plus «pratique» est le passager phusian et une application de rails. (Le type de passager trompeur est en fait un processus d'apache de mod_rails qui gère beaucoup d'applications de ruby ​​qui sont dormies/garées). Par conséquent, vous développez une application rails ou une application sinatra. Puis déployez-le sur un serveur Web avec passager installé.

Le leader est en fait l'équilibreur de charge passager. Le passager est une personne visitant une page Web. Les taxis sont les instances de sommeil de votre application rails dans la piscine de l'appareil passager.

Lorsque vous définissez ce pool sur 45 (application database.yml dans rails). Vous dites que je veux 45 taxis prêts à servir les pages Web. Lorsque quelqu'un visite un passager hôte virtuel, il délègue la demande à l'une des 45 applications de barre d'attente. Les applications n'ont pas besoin de communiquer entre elles car elles sont toutes connectées au même backend de base de données (ou multiple si vous effectuez une réplication de vos données).

http://www.modrails.com/. Le truc cool est que même si les processus séparés peuvent prendre un certain temps pour traiter une requête, le système total est vraiment efficace/rapide parce que vous avez 45 d'entre eux prêts à traiter les demandes. Donc, même si le premier taxi (rail application) n'est pas de retour de son tour (desservant une page demandée) la deuxième instance en attente en ligne peut être utilisé pour une demande suivante. Dès que le premier se termine, il remonte également dans la file d'attente et ainsi vous pouvez être réactif et obtenir facilement 4000+ pagereq./sec même si une seule application rails ne peut gérer que 400req/sec. Bien sûr, il ya des limitations (mémoire etc pour la taille du pool, sinon vous pourriez prendre une taille de 200000 applications) mais en pratique cela fonctionne très bien ...

+0

Ceci est une explication des pools de threads, pas du modèle leader/suiveur. – Michael