Implementación de RateLimiter distribuido (límite de tráfico) basada en Redis
El sistema necesita interactuar con la interfaz de descanso del proveedor de mensajería instantánea para poder enviar mensajes (y otros servicios de mensajería instantánea) al cliente.
El proveedor tiene límites de frecuencia en las llamadas de la interfaz de descanso: total llamadas de descanso El número de veces es 9000 veces/30 segundos; el número de mensajes enviados es 600 veces/30 segundos
El sistema es un clúster distribuido y el sistema necesita controlar el número total de interfaces. llamadas al cluster distribuido.
El artículo anterior "Análisis del código fuente de Guava RateLimiter" presentó el método de uso y el principio de Guava RateLimiter, pero ¿por qué no utilizar Guava RateLimiter directamente?
¿Por qué elegir redis? ¿Más razonable?
Esta es una referencia completa a la idea de implementación de Guava RateLimiter. La diferencia es que Guava almacena los datos en el depósito de tokens en el objeto (memoria). el depósito de tokens en redis, el código fuente es /manerfan/m...
Primero cree el modelo de datos del depósito de tokens
La función reSync también resuelve el problema de la actualización. los datos del depósito de tokens Cada vez que se obtiene el depósito de tokens, se llama antes de la tarjeta, no hay mucho que decir aquí
La función de caducidad se utiliza para calcular el tiempo de caducidad de los datos de Redis. En el mismo ejemplo, debe crear una interfaz para cada usuario para limitar la frecuencia de acceso. Suponiendo que hay 6 W de usuarios en el sistema, se deben crear hasta 6 W de datos en redis para un sistema en funcionamiento a largo plazo. Este número solo aumentará. Esto también es un gran desafío para Redis (aunque el número en el ejemplo es relativamente pequeño). Para reducir la presión sobre Redis, los datos del depósito de tokens deben caducar y pueden limpiarse a tiempo para escenarios comerciales donde la frecuencia de uso no es muy alta.
putDefaultPermits se usa para generar el depósito de tokens predeterminado y almacenarlo en redis
El método de establecimiento de obtención de permisos se usa para obtener y actualizar el depósito de tokens en redis
ahora se utiliza para obtener la hora del servidor redis para garantizar la coherencia del procesamiento de datos en cada nodo del clúster distribuido.
Esta función es equivalente a reserveAndGetWaitLength, excepto que se agrega un bloqueo de sincronización para evitar problemas de concurrencia
Tenga en cuenta que, a diferencia de Guava RateLimiter, Guava devuelve nextFreeTicketMarker, que es antes de actualizar la última solicitud. de eso. Si se utiliza nextFreeTicketMicros, la solicitud implementará el manejo de solicitudes en ráfaga cobrando por el comportamiento preconsumido de la solicitud anterior. Lo que se devuelve aquí es el tiempo real de espera debido a que no hay suficientes tokens en el depósito.