È una cattiva pratica per il mio back-end chiamare le API di terze parti in modo sincrono durante l'elaborazione di una richiesta?

2

Uso un'API di terze parti sulla mia webapp a cui si accede quando l'utente richiede una risorsa specifica. Sono preoccupato che le successive chiamate API che si verificano sulla richiesta dell'utente possano far sì che l'utente attenda molto a lungo e rallenti il mio sistema (poiché il thread che processa la richiesta iniziale è anch'esso in attesa di queste chiamate API per tornare).

quindi fondamentalmente client - > server - > x3 API di terze parti (sono necessarie tre chiamate successive)

Dettagli: queste chiamate API effettuano il login dell'utente con il sistema di terze parti e restituiscono un token di sessione. Attualmente stai usando Django nel back-end.

In questo modo è sempre una cattiva idea in questo modo? Ho preso in considerazione la creazione di un'architettura asincrona e la sto servendo all'utente tramite websocket, ma sono esitante a causa della complessità aggiuntiva percepita del design.

    
posta Jad S 20.09.2017 - 10:58
fonte

3 risposte

2

Le chiamate sincrone a questo scopo vanno bene, soprattutto se hai bisogno del risultato della chiamata per continuare l'elaborazione della richiesta.

Dovresti farlo in modo asincrono se hai un motivo per farlo. Molte persone non se ne rendono conto ma fare qualcosa di asincrono o in parallelo può creare molti problemi e c'è molta complessità anche se è ben nascosto (come il C # async / await).

Quindi, se tu

  • può continuare ad elaborare la richiesta senza avere la risposta dell'API di terze parti ma i dati devono essere nella tua risposta (ad esempio puoi fare altre cose in parallelo con l'attesa della risposta)
  • non ne ha davvero bisogno per continuare ma è bello averlo, tuttavia non importa se è o non è nella tua risposta (cioè puoi fare altre cose in parallelo con esso ma non aspettare per questo - se non ritorna in tempo, puoi comunque inviare la tua risposta)
  • non ne ha affatto bisogno per questa richiesta e può inviarlo al cliente più tardi

dovresti farlo in modo asincrono. Il primo caso è probabilmente il più comune.

Nel tuo caso particolare, probabilmente hai bisogno che l'utente sia autenticato e autorizzato prima di continuare l'elaborazione della richiesta. Quindi lo farei in modo sincrono. Un'altra domanda sono le 3 chiamate successive. Possono essere in parallelo? Quindi puoi farlo e attendere che tutti e 3 siano completati. In caso contrario, puoi chiedere di modificare l'API per consentire una sola chiamata? Questa sarebbe la "cosa giusta da fare", ma di solito è impossibile.

    
risposta data 20.09.2017 - 14:55
fonte
3

Synchronous non è raro. Le web socket a tale scopo sarebbero strane.

Sembra che le tue comunicazioni seguano un modello di richiesta / risposta, quindi HTTP è la risposta giusta. Se si sceglie di scrivere il codice "sincrono" sul client, l'O / S darà i cicli ad altri processi.

Sul server, è OK mettere tre chiamate back-end in serie del genere. Non è il massimo, ma è abbastanza comune. Non hai intenzione di salvare alcuna risorsa usando WebSockets.

    
risposta data 20.09.2017 - 13:16
fonte
1

Se puoi farlo asincrono, dovresti.

Tuttavia, a meno che le chiamate non possano essere eseguite in parallelo, il vantaggio di eseguirle asincronic dipende dalla tecnologia del server.

A meno che tu non stia liberando il tempo del processore per fare altre cose, non ha senso. Quindi assicurati che l'intera procedura di richiesta sia in esecuzione asincrona. Non solo il blocco fino al ritorno delle chiamate asincrone asincroni.

Nella maggior parte dei casi questo non sarà un grande cambiamento. Ad esempio, se si sta eseguendo .net, è sufficiente aggiungere la parola chiave async al metodo webapi.

Sembra dalla tua domanda che vuoi rimuovere il tuo server dall'equazione e fare in modo che il client passi direttamente alla terza parte?

Ciò obsvarrà i costi del tuo server, ma potresti aver bisogno di quel server per nascondere la tua chiave API o qualcosa del genere.

    
risposta data 20.09.2017 - 11:33
fonte

Leggi altre domande sui tag