Voici un débat intéressant qui se passe entre moi et mon collègue lorsqu'il viendra manipuler SOA Exceptions:
D'un côté, je soutiens ce que Juval Lowy a dit dans la programmation des services de WCF 3ème édition:
Comme indiqué au début de ce chapitre, c'est une illusion commune que les clients se soucient d'erreurs ou ont quelque chose de significatif à faire quand ils se produisent. Toute tentative de cuisson de ces capacités dans le client crée un degré d'accouplement démesuré entre le client et l'objet, soulevant de graves questions de conception. Comment le client peut-il en savoir plus sur l'erreur que le service, à moins qu'il ne soit étroitement couplé? Et si l'erreur est originaire de plusieurs couches sous le service - si le client doit être couplé à ces couches Lowlevel? Si le client essaie l'appel à nouveau? À quelle fréquence et à quelle fréquence? Le client doit-il informer l'utilisateur de l'erreur? Y a-t-il un utilisateur? En présentant toutes les exceptions de service, il est indiscernable les uns des autres, WCF découle le client du service. Moins le client connaît ce qui s'est passé sur le côté du service, plus l'interaction sera découplée.
De l'autre côté, voici ce que mon collègue suggère:
Je crois que c'est tout simplement incorrect, car il ne s'aligne pas avec les meilleures pratiques dans la construction d'une architecture orientée entre services et ignore l'idée générale des problèmes que les utilisateurs sont capables de récupérer de manière à ne pas cligner correctement une valeur. Si nous n'avions considéré que des exceptions de systèmes, cette idée est peut-être considérée, mais des exceptions de systèmes ne font qu'une partie du domaine d'exception. Les exceptions recouvrables de l'utilisateur sont l'autre partie du domaine et sont susceptibles de se produire régulièrement. Je crois que la bonne façon de construire une architecture orientée de services consiste à mapper des situations recouvrables de l'utilisateur sur des exceptions vérifiées, puis à Marshall à chaque exception vérifiée au client comme une exception unique que les programmeurs d'applications client sont en mesure de gérer de manière appropriée. Marshall Toutes les exceptions d'exécution Retourner au client comme une exception système, ainsi que la trace de la pile afin qu'il soit facile de résoudre la cause première de la cause.
J'aimerais savoir ce que vous pensez de cela.
Un service qui ne fournit aucun statut sur sa santé ou l'exécution d'une transaction est comme une boîte noire - le consommateur de service et les administrateurs qui surveillent l'environnement ne peuvent pas dire si les choses fonctionnent.
Il existe plusieurs techniques pour instrumenter les services de surveillance. Vous pouvez implémenter un battement de coeur dans lequel le service envoie un message "Je suis en vie" pouvant être ramassé par un moniteur. Ceci est une tâche simple mais ne vous dit pas vraiment si le service fonctionne - seulement qu'il fonctionne et a la possibilité d'envoyer un message. C'est cependant plus qu'un moniteur de niveau d'exploitation du système d'exploitation vous indiquera. Vous pouvez configurer le moniteur pour enregistrer automatiquement le service de surveillance lorsqu'il voit le cœur battre la première fois.
Vous pouvez également développer une interface de surveillance, j'appelle une interface "ping". Vous envoyez l'interface Ping un message et l'interface peut effectuer des vérifications internes de fonctionnalités et de répondre. Cela vous indique plus que le service est simplement opérationnel. Vous pouvez également construire dans le support d'une "transaction synthétique" où vous envoyez des transactions spécifiques à un ensemble de services et exécutez la transaction mais sans impact sur l'entreprise - comme la mise à jour d'un compte de test. Mais, pour dire si un service fonctionne correctement dans le contexte de toutes les transactions commerciales, vous devez développer un cadre de surveillance au niveau des applications.
La surveillance au niveau des applications nécessite des données d'état sur chaque transaction commerciale. La possibilité de surveiller une application dans un contexte commercial ou transactionnel nécessite une interface de surveillance au sein du service pour envoyer des messages détaillant l'état de la transaction spécifique à l'invocation du service. Cela nécessite chaque service d'envoyer un message d'état aux étapes critiques de la transaction commerciale. Vous pouvez ensuite créer un visualiseur en temps réel pour corréler les messages d'état (basé sur la sémantique du message - E.G. ID de transaction) avec les services de l'application composite. Cela fournit une vision de bout en bout de la transaction commerciale pour SLA Gestion, Traçage des défauts et détermination des problèmes.
Voici un ensemble d'utilitaires qui aident à mettre en œuvre ce cadre. J'ai aidé à construire ces utilitaires.