9
votes

Decouple Programmes utilisant des files d'attente

dans son Talk à la note de 54:53 minutes, Rich Hickey parle de l'utilisation de l'utilisation de files d'attente comme moyen de découpler des pièces du programme dépendantes. Pouvez-vous me donner un exemple sur la manière de déposer la pièce suivante de Java-pseudo-code afin d'améliorer sa conception et / ou sa flexibilité: xxx

sauvegardisetodatabase et sauvegardjecttodatabase peut être considéré comme une méthode avec des effets secondaires, tandis que ComputeB S et sootec SPASS dépend de a < /code >.

Je sais que cette question est plutôt vague / large. J'aimerais avoir un sentiment sur la manière de tirer parti des mécanismes de mise en file d'attente sans compliquer massivement mon programme et en vous assurant que cela fait la bonne chose dans le bon ordre. Tous les pointeurs dans la bonne direction sont appréciés.


4 commentaires

Ce n'est pas très clair. L'exemple que vous affichez a une méthode autonome, qui n'utilise aucune dépendance externe. Il n'y a rien à découpler car le travail n'est pas couplé à rien.


Je suppose que @matt souhaite obtenir des threads différents en faisant les méthodes Computeb () et Computerec (), à l'aide des files d'attente pour déplacer des unités de travail entre les différents threads.


Découvrez modèles d'intégration d'entreprise .


Merci pour le lien de livre, jetez un coup d'œil à cela.


4 Réponses :


3
votes

Eh bien, ce n'est pas un très bon exemple, mais (dans la conception la plus directe), vous avez essentiellement deux files d'attente et (en fonction de la quantité de données impliquées), vous pourriez omettre la base de données.

Un premier processus recevrait votre A d'objets du "World extérieur" et en faisez-les dans la file d'attente 1. Un deuxième processus désactiverait des objets de la file d'attente 1, exécutez Computeb et en faisez les résultats sur la file d'attente 2. Un troisième processus désactiverait des objets de la file d'attente 2, exécutez CompuTec et loger le résultat ou quoi que ce soit.

Selon, comme je l'ai dit, sur la quantité de données impliquée (et peut-être quelques autres facteurs), les "objets" passés dans les files d'attente pourraient être votre réel et b < / code> Objets ou bien simplement jetons / clés pour trouver les données de la base de données.

Les files d'attente elles-mêmes pourraient être appliquées de plusieurs manières. Il est possible de mettre en œuvre une file d'attente avec une base de données, par exemple, bien que les détails reçoivent une sorte de messy. Les "processus" pourraient être des tâches Java dans un processus Java unique ou pourraient être des processus de système d'exploitation distincts, éventuellement, même sur des machines distinctes.

Lorsque vous utilisez des "pipes" sur UNIX, vous utilisez efficacement les files d'attente de cette mode.


0 commentaires

1
votes

C'est exactement le principe utilisé par une bibliothèque Java que j'utilise. L'idée est d'avoir des composants attribués à des tâches individuelles dans les programmes (l'enregistreur est un exemple parfait). Maintenant, chaque composant doit être exécuté indépendamment des autres, soit comme un fil de fil de l'événement.

Dans le cas de l'événement, chaque composant notifie les types d'événements \ Messages qu'il souhaite écouter. Vous avez un répartiteur qui rassemble des messages entrants et les insérez dans la file d'attente des destinataires. Le processus de récepteur et génère éventuellement de nouveaux messages. Etc ...

Dans votre cas, quelque chose comme ceci: xxx

};

La bibliothèque en question est < un href = "http://www.eecs.harvard.edu/~mdw/proj/seda/" rel = "nofollow"> Seda .


0 commentaires

0
votes

J'ai peur avec des méthodes de sauvegarde ayant un effet secondaire, vous ne pouvez pas le découper bien ou du moins pas facilement.

Mais disons que vous avez besoin d'écrire dans la base de données des objets rapidement. Mon opinion est que le moyen le plus rapide avec la DB relationnelle devrait être de sauvegarder les objets à une file d'attente par plusieurs clients et de les ramasser par un ou deux écrivains assez rapides poussant les données à la base de données aussi vite que possible.


0 commentaires

0
votes

Par souci d'exhaustivité, j'aimerais ajouter encore plus d'informations à la réponse de Licks chauds:

Je fais plus de recherches sur ce sujet et je suis finalement arrivé à la conclusion, que démêler la méthode est la marche à suivre. Je vais utiliser la terminologie de Kafka des producteurs / consommateurs / sujets. Pour plus d'informations, voir Le journal: quel ingénieur logiciel devrait connaître l'abstraction unificateur de données en temps réel et en particulier ce graphique:

 Entrez la description de l'image ici < / p>

En ce qui concerne ma question spécifique de l'exemple publiée, il existe deux façons de le résoudre:

Solution 1

  • consommateur 1:
    • consommer du sujet a
    • Enregistrer dans la base de données.
    • consommateur 2:
      • consommer du sujet a
      • Compute B
      • Enregistrer dans la base de données.
      • consommateur 3: consommer de sujet a
        • Compute B
        • Compute C
        • Enregistrer dans la base de données

          Ceci a l'inconvénient de l'informatique B deux fois . En pseudo-code: xxx

          solution 2

          • consommateur 1:
            • consommer du sujet a
            • Enregistrer dans la base de données.
            • consommateur 2:
              • consommer du sujet a
              • Compute B , enregistrer dans la base de données
              • Publier B à un sujet distinct B .
              • consommateur 3:
                • consommer du sujet b
                • Compute C
                • logtofile C

                  en pseudo-code: xxx


0 commentaires