2017-09-27 1 views
-1

Je travaille sur un système où un serveur reçoit des requêtes de l'interface utilisateur (client) puis crée un appel vers un autre serveur qui communique avec une API Web externe. Le problème auquel je suis confronté est une incohérence entre les deux serveurs, car le serveur API externe peut échouer à faire des actions avec l'API externe, parfois il peut échouer après 20 minutes environ.Architecture de la meilleure pratique pour la cohérence serveur à serveur

Ainsi, le statut peut être

serveur A envoyé demande au serveur soit et a obtenu 200 ok - Statut sur le serveur A peut être actif ou PENDING serveur B envoie un appel API et échoue - Statut sur le serveur B est maintenant l'erreur

Quelle est la meilleure pratique pour dire au serveur A que l'action a réellement échoué?

Répondre

0

Dépend fortement de la conception du client et du serveur. Si je vous comprends bien, appel API à partir du serveur B à l'API externe (je l'appelle C dans le texte suivant) est conçu de manière asynchrone:

A ---------> B 
A <-- ACK -- B 
       B ---------> C 
       B <-- ERR -- C 

(A <-- ERR -- B) 
^ that is your question 

Selon la communication de messages, il y a plusieurs possibilités. Si vous utilisez des appels REST, votre reconnaissance de B à A pourrait contenir un ID d'opération et un point final où A pourrait demander le statut de l'opération:

{ 
    status: queued, 
    operationId: 12345 
    operationStatusUri: yourhost.com/api/queue/123456 
} 

Le client peut maintenant utiliser un Un appel au vote de la statut.

Si vous avez une sorte d'architecture basée sur les messages, vous pouvez envoyer l'erreur de B vers A en utilisant un système de bus de messages.