Estoy desarrollando una API REST simple usando Spring 3 + Spring MVC. La autenticación se realizará a través de OAuth 2.0 o autenticación básica con un token de cliente utilizando Spring Security. Esto todavía está en debate. Todas las conexiones serán forzadas a través de una conexión SSL.¿Cómo implementar la limitación de velocidad basada en un token de cliente en Spring?
He estado buscando información sobre cómo implementar la limitación de velocidad, pero no parece que haya mucha información disponible. La implementación necesita ser distribuida, ya que funciona en múltiples servidores web.
Por ejemplo, si hay tres servidores api A, B, C y los clientes están limitados a 5 solicitudes por segundo, entonces un cliente que realiza 6 solicitudes como tal encontrará la solicitud de C rechazada con un error.
A recieves 3 requests \
B receives 2 requests | Executed in order, all requests from one client.
C receives 1 request /
Se necesita trabajo basado en una muestra incluida en la solicitud, ya que un cliente puede ser hacer peticiones en nombre de muchos usuarios, y cada usuario debe velocidad limitada en lugar de la dirección IP del servidor.
La configuración será de varios (2-5) servidores web detrás de un equilibrador de carga HAProxy. Hay un Cassandra respaldado, y se usa memcached. Los servidores web se ejecutarán en Jetty.
Una posible solución podría ser escribir un filtro de Spring Security personalizado que extraiga el token y compruebe cuántas solicitudes se han realizado con él en los últimos X segundos. Esto nos permitiría hacer algunas cosas, como diferentes límites de velocidad para diferentes clientes.
¿Alguna sugerencia sobre cómo se puede hacer? ¿Existe una solución existente o tendré que escribir mi propia solución? No he hecho mucha infraestructura de sitios web antes.
Estás en el camino correcto con la idea del filtro. Dado que ya está utilizando memcached, debería ser sencillo. – sourcedelica
Parecer un filtro podría ser el camino a seguir. Encontré un artículo útil sobre la implementación de un sistema de intervalos para que pueda verificar el uso de la API durante los últimos X minutos/segundos -> http://chris6f.com/rate-limiting-with-redis. Utiliza redis pero los principios deben ser similares a Memcache o Cassandra. –