2012-08-09 3 views
1

J'ai beaucoup lu sur l'architecture Event Driven et cela me semble logique, mais la question de donner aux utilisateurs un feedback immédiat me trouble.Donner une réponse immédiate aux utilisateurs dans l'architecture Event Driven

Dites qu'un service ('EmployeeService') contient une liste de tous les employés. La logique métier de création d'un salarié se trouve dans ce service.

L'interface utilisateur d'un autre système utilise ce service. L'exigence est (que cela vous plaise ou non) qu'il y ait une grille d'employés, et un bouton 'ajouter un employé' qui affiche un formulaire, et quand vous soumettez le formulaire, il vous renvoie à la grille avec le nouvel employé dans il. La grille montre les champs dérivés qui sont calculés par le service (ceci est important à noter!). Traditionnellement, sur submit, j'aurais affiché un écran de chargement, envoyé de manière synchrone une requête WCF pour enregistrer l'employé, et quand cela aurait été fait, et transmis à la grille (qui aurait certainement maintenant le nouvel employé). Avec EDA, sur submit, je voudrais 'tirer et oublier' une commande pour enregistrer l'utilisateur - mais alors quoi? Je pourrais transmettre à la grille, mais il y a une chance que le nouvel employé ne soit pas encore là? Je pourrais ajouter manuellement à la grille en supposant que tout sera OK, mais comment puis-je afficher les données dérivées calculées par le service? Ou peut-être que je pourrais avoir un «nouvel employé en attente de graphique» affiché sur la grille s'il n'a pas encore été créé, puis faire revenir la page chaque seconde jusqu'à ce qu'elle l'ait fait?

Ceci est un scénario commun alors quelle est la solution commune pour cela?

+0

Le calcul est-il si complexe? Combien de temps faudra-t-il habituellement pour calculer les données? –

+0

@DanielMarbach Il pourrait être presque instantané mais vous ne pouvez pas le garantir. –

+0

Si vous êtes épinglé à des grilles, alors il ne vaut probablement pas la peine d'appliquer les principes de l'EDA. L'approche RPC devrait être très bien dans ce cas. –

Répondre

1

Vous pouvez enregistrer un rappel lors de l'envoi de la commande et bloquer jusqu'à ce que la commande soit terminée.

Si vous avez téléchargé le package NServiceBus, référez-vous simplement à la solution d'exemple AsyncPagesMvc3. Il a un exemple de exactement ce que vous cherchez.

+0

Je suis conscient de cette fonctionnalité mais ce style de requête/réponse doit être évité dans Event Driven Architecture. –

+0

C'est de loin la solution la plus simple compte tenu de vos exigences actuelles.Si vous avez des exigences de mise à jour en temps réel et ne voulez pas suivre un modèle comme celui-ci, EDA peut ne pas être une bonne solution et vous pouvez suivre un style RPC (au moins dans le contexte dans lequel vous opérez) –

+0

généralement une mauvaise odeur. NSB rend très difficile de retomber dans la communication traditionnelle de style RPC. Essayez de coller à Pub/Sub. –

0

Si votre EmployeeService est un service SOA, le bouton Ajouter un employé appartient également à EmployeeService. L'interface utilisateur est simple composée de plusieurs services. Vous pouvez déployer une partie du EmployeeService localement sur le client qui gère la création de l'employé et le calcul (si le calcul n'est pas complexe).

Par exemple:

public class AddEmployeeView 
{ 
    public IBus Bus { get; set; }  

    public void AddNewClicked() { 
     // async calculate 
     // store directly in the employee service database 
     // or dispatch command internally 
     // refresh employee list as the service is the only owner of that data 
     Bus.Publish<NewEmployeeAdded>(m => { }); 
    } 
} 

Ainsi, le AddEmployeeView ci-dessus appartient à la EmployeeService. Le EmployeeService seul a la connaissance comment calculer et stocker de nouveaux employés (même dans sa propre base de données) et est le seul éditeur logique de l'événement NewEmployeeAdded. Et ici disparaît votre complexité.

+0

En supposant que AddEmployeeView fasse partie d'un site Web, comment gérez-vous plusieurs instances de cette vue derrière un équilibreur de charge qui publie le même événement? Pour autant que je comprenne, ce n'est pas possible et/ou une bonne idée. http://www.make-awesome.com/2010/10/why-not-publish-nservicebus-messages-from-a-web-application/ –

+0

Le site Web peut envoyer une commande au serveur qui publie NewEmployeeAdded. –

Questions connexes