Sto sviluppando una semplice API REST utilizzando Spring 3 + Spring MVC. L'autenticazione avverrà tramite OAuth 2.0 o l'autenticazione di base con un token client utilizzando Spring Security. Questo è ancora in discussione. Tutte le connessioni saranno forzate tramite una connessione SSL.Come implementare la limitazione della velocità basata su un token client in primavera?
Ho cercato informazioni su come implementare la limitazione della velocità, ma non sembra che ci siano molte informazioni là fuori. L'implementazione deve essere distribuita, in quanto funziona su più server web.
Ad esempio, se ci sono tre server API A, B, C e i client sono limitati a 5 richieste al secondo, un client che esegue 6 richieste come tali troverà la richiesta C respinta con un errore.
A recieves 3 requests \
B receives 2 requests | Executed in order, all requests from one client.
C receives 1 request /
Ha bisogno di lavoro basato su un token incluso nella richiesta, come un client può essere fare le richieste per conto di molti utenti, e ogni utente dovrebbe essere limitato tasso piuttosto che l'indirizzo IP del server.
L'installazione sarà costituita da più (2-5) server Web dietro un bilanciatore del carico HAProxy. C'è una Cassandra supportata, e viene usata la memcached. I server Web saranno in esecuzione su Jetty.
Una possibile soluzione potrebbe essere quella di scrivere un filtro Spring Security personalizzato che estrae il token e verifica quante richieste sono state fatte con esso negli ultimi X secondi. Questo ci consentirebbe di fare alcune cose come diversi limiti di velocità per diversi clienti.
Qualche suggerimento su come può essere fatto? Esiste una soluzione esistente o dovrò scrivere la mia soluzione? Non ho mai fatto molta infrastruttura di siti web prima d'ora.
Sei sulla strada giusta con l'idea del filtro. Dal momento che stai già usando memcached, dovrebbe essere semplice. – sourcedelica
L'aspetto di un filtro potrebbe essere la soluzione giusta. Trovato un utile articolo sull'implementazione di un sistema di bucket per intervalli in modo da poter controllare l'uso delle API negli ultimi X minuti/secondi -> http://chris6f.com/rate-limiting-with-redis. Usa i redis ma i principi dovrebbero essere simili a memcache o cassandra. –