60 votes

Pourquoi les gens utilisent-ils des bus de messages / d'événements dans leur code?

Je pense que vous avez entendu parler de message/manifestation des bus, c'est le seul endroit lors de tous les événements dans le système de flux. Architectures similaires sont trouvés dans l'ordinateur des cartes mères et des réseaux LAN. C'est une bonne approche pour les cartes mères et cartes réseaux, car elle réduit le nombre de fils, mais c'est bon pour le développement de logiciel? Nous n'avons pas de telles restrictions que l'électronique n'.

L'implémentation la plus simple de bus de message/event bus-comme:

class EventBus {
    void addListener(EventBusListener l}{...}
    void fireEvent(Event e) {...}
}

L'annonce d'événements est fait avec le bus.fireEvent(événement), la réception des messages est activé par bus.addListener(auditeur). Ces architectures sont parfois utilisées à des fins de développement de logiciels, par exemple MVP4G implémente message similaire bus pour GWT, lire:

C'est juste le populaire Observateur (Auditeur) motif de 'globalement' - chaque objet dans le système peut écouter à chaque message, et je pense que c'est dommage, il rompt le principe d'Encapsulation (chaque objet sait tout) et le principe de Responsabilité Unique (par exemple, quand un objet doit un nouveau type de message, événement bus a souvent besoin d'être changé, par exemple pour ajouter un nouveau port d'écoute de la classe ou d'une nouvelle méthode dans la classe Écouteur).

Pour ces raisons, je pense, que pour la plupart des logiciels, modèle Observateur est mieux que le bus d'événement. Que pensez-vous de l'événement de bus, sera-t-elle le bon sens pour les applications typiques?

EDIT: je ne parle pas des "grands" de l'entreprise des solutions, comme ESB - ils peuvent être utiles (ce qui est plus ESB offre beaucoup, beaucoup plus que seulement un événement de bus). Je pose la question sur l'utilité de l'aide de bus de message dans "régulier" de code Java pour objet à objet de connexion - certaines personnes le font, vérifiez les liens ci-dessus. Événement de bus est probablement la meilleure solution pour téléphone-pour-la communication téléphonique ou d'un ordinateur à ordinateur de la communication parce que chaque téléphone (ou l'ordinateur) dans un réseau peut généralement de parler les uns aux autres, de bus et réduit le nombre de fils. Mais des objets rarement parler les uns aux autres - combien de collaborateurs un objet peut avoir - 3, 5?

64voto

Sudarshan Points 1885

Je suis d'envisager d'en utiliser une Dans la mémoire de l'Événement de Bus pour mon code java et mon raisonnement est comme suit

Chaque objet dans le système peut écouter à chaque message, et je pense que c'est mauvais, il rompt le principe d'Encapsulation (chaque objet connaît le tout)

Je ne suis pas sûr si c'est vraiment vrai, j'ai besoins de la classe pour s'inscrire à l'événement de bus pour commencer, semblable à pattern observer, une Fois qu'une classe a enregistré avec l'Événement de Bus, seules les méthodes qui ont la signature et les annotations sont notifiés.

et le principe de Responsabilité Unique (par exemple, quand un objet doit une nouveau type de message, événement bus a souvent besoin d'être changé par exemple pour ajouter un nouveau port d'écoute de la classe ou d'une nouvelle méthode dans la classe Écouteur).

Je suis totalement en désaccord avec

event bus a souvent besoin d'être changé

L'événement bus n'est jamais changé

Je suis d'accord avec

add a new Listener class or a new method in the Listener class

Comment cette rupture SRP ?, Je peux avoir un BookEventListener qui s'abonne à tous les événements qui ont trait à mon Livre Entité, et oui je peux ajouter des méthodes de cette classe, mais toujours cette classe est cohérent ...

Pourquoi j'ai l'intention de l'utiliser ? Il m'aide à modèle du "quand" de mon domaine ....

Habituellement, nous entendons quelque chose comme envoyer un mail "quand" le livre est acheté

nous allons écrire

book.purchase();
sendEmail()

Ensuite, nous dit-on ajouter un journal d'audit lorsqu'un livre est acheté , nous allons à l'extrait ci-dessus

book.purchase();
sendEmail();
**auditBook();**

OCP violé

Je Préfère

book.purchase();
EventBus.raiseEvent(bookPurchasedEvent);

Puis continuez d'ajouter des gestionnaires en tant que de besoin Ouvert pour l'Extension Fermées pour la Modification

Merci

25voto

duffymo Points 188155

Certaines personnes l’apprécient car c’est l’incarnation du motif Facade ou Mediator. Il centralise les activités transversales telles que la journalisation, les alertes, la surveillance, la sécurité, etc.

Certaines personnes ne l'aiment pas parce que c'est souvent un point d'échec pour Singleton. Tout doit savoir à ce sujet.

16voto

Bal Points 592

Je l'utilise massivement dans JavaScript. Il peut être si beaucoup de différents widgets qui tous besoin de faire une sorte d'action à chaque fois que quelque chose se passe -- il n'y a pas de véritable hiérarchie de la propriété des objets. Au lieu de transmettre les références de chaque objet pour chaque objet, ou tout simplement en rendant chaque objet global, quand quelque chose d'important se passe à l'intérieur d'un widget en particulier, je peux juste de publier "/thisWidget/somethingHappened" -- au lieu de remplir ce widget avec toutes sortes de code spécifique à l'API d'autres widgets. La j'ai une classe unique qui contient tous les "câblage", ou "plubming" comme ils aiment à l'appeler, dans le Java framework Spring. Cette classe contient des références à tous mes widgets, et a l'ensemble du code pour ce qui se passe après chaque divers événement se déclenche.

Il est centralisé, facile d'accès et à maintenir, et si une chose des changements ou des je veux un nouveau processus de se produire sur un événement précis, je n'ai pas à la recherche par le biais de chaque classe/objet/widget pour essayer de trouver où quelque chose est en cours de traitement. Je peux simplement aller à mon "opérateur" de la classe -- celui qui gère l'ensemble de la "câblage" lorsqu'un événement particulier se produit, et voir toutes les répercussions de cet événement. Dans ce système, chaque individu, chaque widget est complètement API agnostique des autres widgets. Simplement, il publie ce qui s'est passé ou ce qu'il fait.

14voto

Qwerky Points 10847

Je vais avoir du mal à comprendre ce que vous êtes vraiment posant des questions dans votre question. Vous donner un exemple d'un simple événement de bus qui n'est en fait qu' Observable avec un nom différent, puis vous le dire;

Pour ces raisons, je pense, que pour la plupart des logiciels, modèle Observateur est mieux que les bus d'événement. Que faites-vous penser à propos de l'événement de bus, est-il tout bon sens typique les applications?

..mais, compte tenu de votre exemple, ils sont les mêmes. Cela me fait me demander si vous avez déjà utilisé quelque chose comme un Bus de Service d'Entreprise. À un niveau de base d'un ESB logiquement fait la même chose que le modèle observateur, mais les produits commerciaux ajouter beaucoup, beaucoup plus. Son comme un événement de bus sur les stéroïdes. Ils sont d'un logiciel compliqué produits et de l'offre;

Message de ramassage
Générer des événements par l'écoute des différents points de terminaison. Le point de terminaison peut être un port d'écoute (comme un serveur HTTP), un système de messagerie (comme JMS), une base de données ou n'importe quoi d'autre que vous voulez.

Le routage des messages
Prenez votre événement et de l'envoyer à un ou plusieurs point de terminaison. Le routage peut être assez intelligent, le bus peut router le message en fonction du type de message, le contenu du message ou de tout autre critère. Le routage peut être intelligent et dynamique.

Message De Transformation
Transforme votre message dans un autre format, ce peut être aussi simnple comme du XML en JSON ou à partir d'une ligne dans une table de base de données d'une requête HTTP. La Transformation peut se produire dans les données, par exemple en échangeant des formats de date.

Enrichissement De Données
Ajoute ou modifie des données dans votre message en appelant les services, le long de la manière. Par exemple, si un message a un code postal dans le bus pourrait utiliser un code postal de service de recherche à ajouter dans les données d'adresse.

..et beaucoup, beaucoup plus. Lorsque vous commencez à regarder dans les détails, vous pouvez vraiment commencer à voir pourquoi les gens utilisent ces choses.

2voto

questzen Points 1963

Une bonne analogie est celle d'un téléphone, d'échange, où chaque combiné peut composer pour tous les autres combinés. Un compromis combiné pouvez régler les conversations des autres. Programme de contrôle de flux comme les fils(complexité cyclomatique à personne!) Ceci est similaire à la condition d'avoir une connexion/support physique entre les deux points d'extrémité. Il en est Ainsi pour N combinés au lieu d'avoir CN2 (logique Combinatoire) flux pour chaque nouvel appareil, nous avons tendance à obtenir N flux.

Une réduction de la complexité implique facile à comprendre le code. Permet de commencer avec les plus éminents de points que vous avez mis en évidence: 1. Mondial de la connaissance 2. Intrusive modifications.

Mondial de la Connaissance: Envisager de message d'événement soit une enveloppe. À partir du gestionnaire d'événement/de l'expéditeur point de vue il n'y a pas de données d'être exposé, c'est de voir une enveloppe (à moins qu'une classe dérivée essaie de faire des inspections en utilisant "instanceof" vérifications). Dans une bonne conception de la programmation orientée objet, ce ne serait jamais se produire.

Intrusive modifications: au Lieu d'avoir un événement spécifique approche de l'auditeur, on peut utiliser une approche globale de la gestion des événements approche. Comme nous avons un mondial type d'événement (sur lequel les données sont piggy soutenu et bas-coulé). C'est un peu comme la PropertyBeanSupport modèle en Java. Avec un seul type d'événement, nous sommes tenus d'avoir un seul expéditeur et l'auditeur types. Cela implique que vous devez pas modifier le bus/auditeurs à chaque fois que vous voyez quelque chose de nouveau. Le laid-casting peut être soothened à l'aide de l'Adaptateur (Merci de ne pas commencer un autre niveau de la redirection de citer!). Les programmeurs peuvent écrire assemblée dans n'importe quelle langue. Donc besoin de bon sens et de l'intelligence ne peut être remplacé. Tous j'ai l'intention de l'état est-il peut être un outil efficace.

L'événement réel récepteurs peuvent utiliser les auditeurs (composition/proxy) facilement. Dans un tel code Java de base, les auditeurs de ressembler autonome intérieure déclarations de classe (non utilisé avertissement signalé dans certaines IDEs). C'est akeen à deux joueurs sur la plage de jouer à un jeu de ballon, les joueurs ne réagissent pas jusqu'à ce qu'ils voir la balle.

'@duffymo", fait remarquer un autre aspect intéressant: 'point de défaillance Unique'. Ce serait/peut, en théorie, l'effet de n'importe quel objet qui résident dans la mémoire vive(RAM) et non spécifiques à MessageHandlers.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X