rapido quemar pastillas para mujeres metabolismo maximo lento grasa dieta cómo como alimentos adelgazar acelerar abdominal php linux apache throttle

php - quemar - ¿Cómo acelero los usuarios de la API de mi sitio?



dieta para acelerar el metabolismo (6)

Los usuarios legítimos de mi sitio a veces martillan el servidor con solicitudes API que causan resultados indeseables. Quiero establecer un límite de no más de una llamada de API cada 5 segundos o n llamadas por minuto (aún no he calculado el límite exacto). Obviamente, pude registrar todas las llamadas de la API en un DB y hacer el cálculo en cada solicitud para ver si están por encima del límite, pero toda esta carga adicional en CADA solicitud sería contraria al propósito. ¿Cuáles son otros métodos menos intensivos en recursos que podría usar para establecer un límite? Estoy usando PHP / Apache / Linux, por lo que vale.


Además de la implementación desde cero, también puedes echarle un vistazo a la infraestructura de API como 3scale ( http://www.3scale.net ) que limita la velocidad, así como muchas otras cosas (análisis, etc.). Hay un complemento de PHP para ello: https://github.com/3scale/3scale_ws_api_for_php .

También puedes pegar algo así como Varnish enfrente de la API y limitar la velocidad de API así.


La solución más sencilla sería simplemente dar a cada clave de API un número limitado de solicitudes por 24 horas, y reiniciarlas en algún momento conocido y fijo.

Si agota sus solicitudes de API (es decir, el contador llega a cero, o el límite, dependiendo de la dirección en la que esté contando), deje de darles los datos hasta que restablezca su contador.

De esta manera, será en su mejor interés no molestarlo con solicitudes.


No sé si este hilo todavía está vivo o no, pero sugeriría mantener estas estadísticas en la memoria caché como memcached. Esto reducirá la sobrecarga de registrar la solicitud en la base de datos, pero aún sirve para el propósito.


Puede controlar la frecuencia con el algoritmo del depósito de fichas , que es comparable con el algoritmo del cubo con fugas. Tenga en cuenta que tendrá que compartir el estado del depósito (es decir, la cantidad de tokens) sobre los procesos (o cualquier ámbito que desee controlar). Por lo tanto, es posible que desee pensar en bloquear para evitar las condiciones de carrera.

La buena noticia: hice todo eso por ti: bandwidth-throttle/token-bucket

use bandwidthThrottle/tokenBucket/Rate; use bandwidthThrottle/tokenBucket/TokenBucket; use bandwidthThrottle/tokenBucket/storage/FileStorage; $storage = new FileStorage(__DIR__ . "/api.bucket"); $rate = new Rate(10, Rate::SECOND); $bucket = new TokenBucket(10, $rate, $storage); $bucket->bootstrap(10); if (!$bucket->consume(1, $seconds)) { http_response_code(429); header(sprintf("Retry-After: %d", floor($seconds))); exit(); }


Usted dice que "todos los gastos indirectos adicionales en CADA solicitud estarían anulando el objetivo", pero no estoy seguro de que sea correcto. ¿No es el propósito de evitar el martilleo de su servidor? Esta es probablemente la forma en que lo implementaría, ya que solo requiere una lectura / escritura rápida. Incluso podría sacrificar las verificaciones del servidor de la API a una base de datos / disco diferente si estuviera preocupado por el rendimiento.

Sin embargo, si desea alternativas, debe verificar mod_cband , un módulo de apache de terceros diseñado para ayudar en la aceleración del ancho de banda. A pesar de ser principalmente para la limitación del ancho de banda, también puede acelerarse en función de las solicitudes por segundo. Nunca lo he usado, así que no estoy seguro de qué tipo de resultados obtendrías. Hubo otro módulo llamado mod-throttle también, pero ese proyecto parece estar cerrado ahora, y nunca fue lanzado para nada por encima de la serie Apache 1.3.


Ok, no hay forma de hacer lo que solicité sin escribir nada en el servidor, pero al menos puedo eliminar el registro de cada solicitud. Una forma es usar el método de aceleración "leaky bucket", donde solo hace un seguimiento de la última solicitud ( $last_api_request ) y una proporción del número de solicitudes / límite para el marco de tiempo ( $minute_throttle ). El cubo con fugas nunca restablece su contador (a diferencia del acelerador de Twitter API que se restablece cada hora), pero si el depósito se llena (el usuario alcanzó el límite), deben esperar n segundos para que el depósito se vacíe un poco antes de poder realizar otra solicitud . En otras palabras, es como un límite móvil: si hay solicitudes previas dentro del marco de tiempo, se están filtrando lentamente del cubo; solo te restringe si llenas el cubo.

Este fragmento de código calculará un nuevo valor de $minute_throttle en cada solicitud. Especifiqué el minuto en $minute_throttle porque puede agregar aceleradores para cualquier período de tiempo, como por hora, por día, etc. ... aunque más de uno comenzará a confundir rápidamente a los usuarios.

$minute = 60; $minute_limit = 100; # users are limited to 100 requests/minute $last_api_request = $this->get_last_api_request(); # get from the DB; in epoch seconds $last_api_diff = time() - $last_api_request; # in seconds $minute_throttle = $this->get_throttle_minute(); # get from the DB if ( is_null( $minute_limit ) ) { $new_minute_throttle = 0; } else { $new_minute_throttle = $minute_throttle - $last_api_diff; $new_minute_throttle = $new_minute_throttle < 0 ? 0 : $new_minute_throttle; $new_minute_throttle += $minute / $minute_limit; $minute_hits_remaining = floor( ( $minute - $new_minute_throttle ) * $minute_limit / $minute ); # can output this value with the request if desired: $minute_hits_remaining = $minute_hits_remaining >= 0 ? $minute_hits_remaining : 0; } if ( $new_minute_throttle > $minute ) { $wait = ceil( $new_minute_throttle - $minute ); usleep( 250000 ); throw new My_Exception ( ''The one-minute API limit of '' . $minute_limit . '' requests has been exceeded. Please wait '' . $wait . '' seconds before attempting again.'' ); } # Save the values back to the database. $this->save_last_api_request( time() ); $this->save_throttle_minute( $new_minute_throttle );