2017-01-11 1 views
0

Je travaille sur la conception d'un système distribué. Le système se compose de plusieurs producteurs, file d'attente distribuée et plusieurs consommateurs aka travailleurs. Les instances de travail résident dans des centres de données situés à différents emplacements. Parfois, un emplacement est déconnecté manuellement.Consommateurs de files d'attente distribués dans un réseau instable

Dans ce cas, le problème est que l'opérateur à partir de l'emplacement déconnecté obtient une tâche de la file d'attente et s'arrête avant la fin de la tâche. Je veux:

  1. travailleurs de l'endroit vivant pouvoir obtenu cette tâche et compléter
  2. lorsque travailleur déconnecté se enfin, il doit déterminer si la tâche a déjà été complétée par d'autres travailleurs et décider quoi faire avec elle

Quelle est la manière commode de résoudre ce problème?

Répondre

1

Cette conception pourrait vous aider. Chaque fois qu'un travailleur consomme une tâche, déplacez la tâche de la file d'attente vers une autre liste distribuée de tâches consommées. Dans cette liste de tâches, conservez un horodatage avec chaque tâche. Puis le travailleur qui a consommé la tâche devrait envoyer un message toujours vivant chaque seconde (similaire au message hearbeat de hadoop) qui met à jour l'horodatage d'une tâche dans la liste des tâches consommées. Ceci est pour indiquer que le travailleur qui a consommé cette tâche est toujours vivant et a reçu un message de lui récemment. Maintenant, implémentez un démon pour surveiller cette liste de tâches consommées et replacer les tâches dans la file d'attente dont l'horodatage est plus ancien qu'un nombre seuil de secondes (en considérant les pertes de messages).