È una cattiva pratica che l'applicazione client determini dinamicamente il limite di velocità per la tua API?

1

Mi sono imbattuto in un'API di un famoso fornitore nel mio settore che chiede al cliente di determinare dinamicamente i max record consentiti in una singola richiesta POST eseguendo prima una richiesta GET e recuperando una proprietà chiamata MaxRequestSize. L'idea è che il client utilizzi questa proprietà per dividere i propri record e fare più richieste POST all'API in base al valore di questa proprietà.

C'è una ragione per cui vorresti farlo? È una cattiva pratica in generale?

Modifica: l'API è un'API di geocodifica

    
posta Conor 25.08.2016 - 18:31
fonte

3 risposte

3

Posso pensare ad un paio di buoni motivi per cui potresti volere un simile meccanismo.

La più ovvia è che il server può ottimizzare la dimensione delle richieste che riceve in base alle necessità. Questo potrebbe essere importante durante i periodi di utilizzo intensivo del server, ad esempio.

Può anche incoraggiare i grossi utenti a fare le loro richieste di grandi dimensioni durante le ore non di punta.

    
risposta data 25.08.2016 - 18:48
fonte
1

Ciò ti consente di ridurre al minimo il sovraccarico.

Ogni richiesta ha un sovraccarico e così tanti record. Più record si registrano, meno spese generali per record. Ma solo così tanti record sono consentiti prima che il server voglia fermarsi e gestire qualcos'altro. Quindi il cliente vuole sapere di più che può inviare prima di essere tagliato.

Questa è una buona idea. È una buona idea che sia una delle maggiori differenze tra il funzionamento di IP v6 rispetto a IP v4. A differenza della v4, la frammentazione dei pacchetti in v6 richiede ad ogni rete che sta per essere attraversata quale sia la dimensione del pacchetto. La risposta più piccola imposta la dimensione. Ora il traffico inizia abbastanza piccolo da non dover essere rifragmentato mentre viene eseguito nella rete successiva.

Questa è la stessa idea. Sta succedendo più in alto sullo stack di rete.

    
risposta data 25.08.2016 - 21:08
fonte
0

Penso che probabilmente non sia un buon progetto.

modifica vedo in un commento che spieghi che si tratta di una API di geocodifica. Presumibilmente si inviano indirizzi e si riceve lat, long

In questo caso di geo-coding, il server è sotto lo stesso carico per indirizzo, quindi l'unica differenza tra una grande richiesta o molte piccole è il tempo di risposta di ciascuna richiesta.

Dato che il client può comunque richiedere lo stesso numero di risultati contemporaneamente, tramite molte richieste simultanee di piccole dimensioni, un design migliore è quello di accodare ciascun indirizzo separatamente per l'elaborazione e restituirli al termine. Idealmente potresti inviare i singoli risultati al cliente.

Potresti anche implementare una strategia di elaborazione round robin se vuoi distribuire equamente il tempo di elaborazione tra molti client.

Di solito un limite di velocità su una API limita il numero massimo di richieste per periodo piuttosto che la dimensione della richiesta.

  • (la restituzione di più record in una singola risposta generalmente non causa alcun carico di CPU aggiuntivo e una singola risposta ampia utilizza meno larghezza di banda rispetto alle stesse informazioni trasmesse in molte piccole risposte)

Supponiamo che tu stia recuperando o caricando n record. Puoi farlo in una o più richieste. Di solito la singola (grande) richiesta metterà meno carico sul server.

  • (Poiché ogni singola richiesta comporta un costo di gestione generale, che devi pagare una volta sola per la singola richiesta di grandi dimensioni vs molte volte per le richieste multiple multiple)

Dato che il client deve ancora elaborare tutte le sue richieste, la sua suddivisione sembrerebbe non offrire alcun valore di prestazione.

  • (Se c'è anche un limite di velocità e il cliente ha bisogno dei dati ora, il client colpirà il limite e l'errore.Se il client non ha bisogno dei dati immediatamente, il server potrebbe inviare una risposta in seguito)

Anche se il client cambia dinamicamente la dimensione del suo batch sembra problematico. Devo fare la chiamata Get ogni volta? Posso memorizzare il valore nella cache? Cosa succede se c'è un ritardo tra l'acquisizione del valore e l'invio del batch?

  • (ci sono tutti i problemi che dovresti risolvere senza limiti fissi)

Un design migliore sarebbe sicuramente avere il server che esegue la suddivisione sul numero richiesto, prima di passarlo internamente al livello successivo e poi riunire i risultati in un'unica risposta.

  • (Supponendo che il costo per elaborare una richiesta di grandi dimensioni non sia lineare, diciamo che O (n ^ 2) il server potrebbe dividere la richiesta con la stessa facilità del client)

Suppongo che tu possa immaginare problemi di timeout con lotti di grandi dimensioni che sono un problema. Ma questo è meglio se si passa a una query di comando o modello asincrono piuttosto che a RPC

  • (L'unica limitazione sulla divisione del server sul client è se ogni richiesta ha un timeout in attesa della risposta.Se si passa a un modello asincrono con una richiamata o un polling dal client, questo può essere negato)
risposta data 25.08.2016 - 19:27
fonte

Leggi altre domande sui tag