1
votes

Architecture pour capturer le résultat du service Web et envoyer le résultat à d'autres services Web

Je développe une application en C #. J'appelle un webservice (appelons ceci WS1) et je veux que le résultat soit envoyé à 1 ou plusieurs autres webservices (externes) (par exemple WS2 et WS3).

Dans le cas où l'un des services Web de réception (par exemple WS2) est en panne, je veux m'assurer que cet appel n'est pas perdu et qu'il est réessayé ultérieurement.

Quelle est une bonne architecture pour y parvenir? Quelqu'un a-t-il un lien vers un document en ligne où une architecture comme celle-ci est décrite?


2 commentaires

Cette question est à la fois trop large et hors sujet (pour la raison décrite par Andreas).


La demande de nouvelle tentative signifie que vous avez besoin d'une file d'attente (liste d'éléments de travail). Le vôtre ou celui dans le cloud, selon l'échelle, etc.


3 Réponses :


-3
votes

Si je comprends bien, vous cherchez à avoir une architecture événementielle où les demandes peuvent être rejouées.

SNS est similaire à SQS dans le découplage de votre architecture et est soit un sujet, soit une file d'attente. La différence est de savoir si vous souhaitez interroger ou pousser ces demandes.

Cas d'utilisation SNS: Vous allez pousser les messages vers un sujet SNS où il stockera le message pendant un maximum de 14 jours. Vous pouvez ensuite planifier la rubrique SNS pour remettre des messages à un point de terminaison de repos. En cas d'échec, vous pouvez gérer cela en plaçant le message sur un DLQ (file d'attente de lettres mortes). S'il réussit, le message sera supprimé du sujet.

Cas d'utilisation de SQS: Vous allez pousser les messages vers un sujet SNS où il stockera le message pendant un maximum de 14 jours. Vous interrogez ensuite la file d'attente pour les événements si les processus d'événements la suppriment de la file d'attente. Sinon, vous pouvez utiliser la stratégie DLQ ou simplement laisser le message dans la file d'attente.

Quelques bonnes lectures sont Stratégies SNS Fanout


1 commentaires

Très rapidement, cette réponse va aux acronymes d'un produit spécifique, plutôt qu'à tout ce qui concerne l'architecture.



1
votes

Une question que vous devrez peut-être poser avant de vous plonger dans l'architecture. Je suppose que WS1 et WS2 appartiennent tous deux à vous / votre équipe.

  1. Combien de temps voulez-vous attendre que WS2 soit de nouveau opérationnel une fois qu'il est arrêté?
  2. Quel est le temps de réponse attendu de WS1 et WS2?
  3. Existe-t-il un autre service en aval qui consomme WS1 et si ce service a une attente de SLA / temps de réponse?
  4. Comment WS1 s'attend-il à consommer la réponse de WS2?

En bref, une approche axée sur les événements semble la meilleure solution ici. c'est-à-dire que vous pouvez avoir une file d'attente entre WS1 et WS2 de telle sorte que WS1 publie un message dans la file d'attente de demandes, WS2 le récupère lorsqu'il est prêt et place la réponse dans une file d'attente de réponse à partir de laquelle WS1 peut le lire. Exemple. AWS et Azure .

Cela peut ou non fonctionner en fonction de la façon dont vous pouvez répondre aux requêtes précédentes. Parfois, il est préférable d'utiliser un appel standard basé sur REST avec une stratégie de nouvelle tentative (Exemple stratégie de recul exponentiel ). Avec cela, vous pourrez peut-être également obtenir un retour plus rapide sur les échecs. On peut choisir ceci si les réponses aux questions ci-dessus sont

  1. Si le temps d'attente est court, c'est-à-dire en secondes
  2. On s'attend à un temps de réponse très rapide. Dans ce cas, il est préférable de signaler immédiatement un échec plutôt que d'attendre.
  3. Si des applications en aval ont une dépendance synchrone sur WS1, WS1 ne peut donc pas attendre indéfiniment que WS2 traite la demande
  4. Il n'y a pas de canal de réponse prévisible de WS2

Sur une note, si vous utilisez une architecture basée sur les événements, WS2 peut ne plus être un service Web :)


0 commentaires

0
votes

Je pense que vous pourriez avoir besoin d'un Load Balancer pour votre architecture de service Web. Vous pouvez utiliser un Raspberry Pi ou n'importe quel PC, installer Linux et exécuter nginx en tant qu'équilibreur de charge, comme ce que je fais actuellement.

Vous pouvez en savoir plus sur Comment configurer Nginx en tant qu'équilibreur de charge


0 commentaires