Comment puis-je l'accélérateur de mon site les utilisateurs de l'API?
Les utilisateurs légitimes de mon site de temps à autre marteau le serveur avec des requêtes à l'API que causer des résultats indésirables. Je veux institut de la limite est de pas plus que de dire un appel d'API toutes les 5 secondes ou n appels par minute (n'ai pas compris la limite exacte pour le moment). Je pourrais évidemment journal de tous les appels de l'API dans une DB et de faire le calcul à chaque requête pour voir si ils sont au dessus de la limite, mais toute cette surcharge sur CHAQUE demande sera de vaincre le but. Quelles sont les autres moins de ressources méthodes que je pourrais utiliser pour instaurer une limite? Je suis à l'aide de PHP/Apache/Linux, pour ce que ça vaut.
- Est-ce juste un bandage pendant que vous ajustez l'API ou d'ajouter d'autres serveurs? Il est très dangereux de prendre quelque chose loin de / mis des restrictions sur les développeurs...
- Non, je suis en train de mettre des limites raisonnables en place pour rendre le site plus durable. L'ajout de la capacité du serveur pour un peu d'excès de zèle des utilisateurs ne fait pas partie du plan.
Vous devez vous connecter pour publier un commentaire.
Ok, il n'y a aucun moyen de faire ce que j'ai demandé sans tout l'écriture sur le serveur, mais je peut au moins éliminer la journalisation à chaque demande unique. Une façon est d'utiliser le "leaky bucket" la limitation de la méthode, où il ne garde la trace de la dernière demande (
$last_api_request
) et un ratio du nombre de demandes/limite pour la période de temps ($minute_throttle
). Le seau percé jamais réinitialise son compteur (contrairement à l'API Twitter de l'accélérateur, qui réinitialise à chaque heure), mais si le seau est plein (utilisateur atteint la limite), il doit attendren
secondes pour le seau pour vider un peu avant de pouvoir faire une autre demande. En d'autres termes, c'est comme un roulement de limite: si il y a des précédentes demandes dans les délais, ils sont lentement la fuite du seau; il ne vous limite si vous remplissez le seau.Cet extrait de code calcule un nouveau
$minute_throttle
valeur à chaque requête. J'ai précisé le minutes dans$minute_throttle
parce que vous pouvez ajouter des commandes pour une période de temps, comme une base horaire, quotidienne, etc... bien que plus d'un va rapidement commencer à faire de confusion pour les utilisateurs.$minute_limit
serait nulle?$minute_throttle
, puisqu'il vient de DB.Vous pouvez contrôler le taux de la token bucket algorithme, qui est comparable à la seau percé algorithme. Notez que vous aurez à partager l'état du seau (c'est à dire le montant de jetons) sur les processus (ou quelle que soit la portée que vous voulez de contrôle). Donc, vous voudrez peut-être penser de verrouillage pour éviter des conditions de course.
La bonne nouvelle: j'ai fait tout ça pour vous: la bande passante de commande gaz/jeton-seau
Je ne sais pas si ce fil est toujours en vie ou pas, mais je vous propose de garder ces statistiques dans la mémoire cache comme memcached. Cela permettra de réduire les frais généraux de l'enregistrement de la demande de la DB, mais encore servir le but.
Solution la plus simple serait de donner à chaque clé API un nombre limité de demandes par 24 heures, et de les remettre à certains connus, fixe, temps.
Si ils épuisent leurs requêtes à l'API (ie. le compteur atteint zéro, ou à la limite, selon la direction que vous comptez), arrêter de les servir données jusqu'à la réinitialisation de leur compteur.
De cette façon, il sera dans leur intérêt de ne pas marteau-vous avec les demandes.
Vous dites que "tous les thos supplémentaire sur CHAQUE demande sera de vaincre le but", mais je ne suis pas sûr que ce soit correct. N'est-ce pas le but de prévenir le martelage de votre serveur? C'est probablement la façon dont je voudrais la mettre en œuvre, car il vraiment ne nécessite un peu de lecture/écriture. Vous pourriez même à la ferme de l'API serveur vérifie pour une autre DB/disque si vous étiez inquiet au sujet de la performance.
Toutefois, si vous souhaitez des solutions de rechange, vous devriez vérifier mod_cband, un tiers de module apache conçu pour aider dans la limitation de bande passante. En dépit d'être essentiellement pour la limitation de bande passante, il peut manette des gaz sur la base de requêtes par seconde ainsi. Je n'ai jamais utilisé, donc je ne suis pas sûr de ce genre de résultats que vous obtiendrez. Il y avait un autre module mod-accélérateur ainsi, mais ce projet semble être fermée maintenant, et n'a jamais été publié pour rien au-dessus de l'Apache 1.3 de la série.
En plus de la mise en œuvre à partir de zéro, vous vous pouvez également prendre un coup d'oeil à l'API de l'infrastructure comme 3scale (http://www.3scale.net) qui n'a de limite de débit ainsi que d'un tas d'autres trucs (analytics, etc.). Il y a un plugin PHP pour elle: https://github.com/3scale/3scale_ws_api_for_php.
Vous pouvez également coller quelque chose comme les Vernis en face de l'API, et ne l'API de limitation de débit comme ça.