30 votes

Meilleure pratique pour limiter le nombre d'utilisateurs d'une API REST ?

Je suis en train de mettre en place une API REST et, comme je ne sais pas comment elle évoluera ou quelle sera la demande, j'aimerais pouvoir limiter le taux d'utilisation et refuser temporairement les demandes lorsque la boîte est surchargée ou en cas de scénario de slashdotted.

J'aimerais également être en mesure d'arrêter temporairement le service (tout en donnant aux clients des résultats indiquant que le service principal est hors ligne pour un moment) lorsque/si je dois faire évoluer le service en ajoutant de la capacité.

Existe-t-il des pratiques exemplaires pour ce genre de choses ? La mise en œuvre est Rails avec mysql.

18voto

temoto Points 1323

Tout ceci est fait avec un serveur web externe, qui écoute le monde (je recommande nginx ou lighttpd).

En ce qui concerne les limites de débit, nginx est capable de limiter, c'est à dire 50 req/minute par chaque IP, tous sur obtenir la page 503, que vous pouvez personnaliser.

En ce qui concerne l'arrêt temporaire prévu, dans le monde de rails, cela se fait via une page spéciale maintainance.html. Il y a une sorte d'automatisation qui crée ou fait un lien symbolique avec ce fichier lorsque les serveurs de l'application Rails sont hors service. Je recommande de ne pas se fier à la présence du fichier, mais à la disponibilité réelle du serveur d'applications.

Mais en réalité, vous êtes en mesure de démarrer/arrêter des services sans perdre la moindre connexion. Par exemple, vous pouvez exécuter une instance distincte du serveur d'applications sur un port UNIX socket/IP différent et faire en sorte que l'équilibreur (nginx/lighty/haproxy) utilise également cette nouvelle instance. Ensuite, vous fermez l'ancienne instance et tous les clients sont servis par la nouvelle. Aucune connexion n'est perdue. Bien sûr, ce scénario n'est pas toujours possible, il dépend du type de changement que vous avez introduit dans la nouvelle version.

haproxy est une solution d'équilibrage uniquement. Elle peut équilibrer de manière extrêmement efficace les demandes adressées aux serveurs d'applications de votre ferme.

Pour un service assez important, vous vous retrouvez avec quelque chose comme :

  • api.domain se résolvant sur des équilibreurs round-robin N balancers
  • Chaque équilibreur redirige les demandes vers les serveurs Web M pour le contenu statique et les serveurs d'applications P pour le contenu dynamique. Oh, mais votre API REST n'a pas de fichiers statiques, n'est-ce pas ?

Pour les services de petite taille (moins de 2K rps), tout l'équilibrage est effectué dans un ou deux serveurs web.

5voto

steve Points 995

De bonnes réponses déjà - si vous ne voulez pas implémenter le limiteur vous-même, il y a aussi des solutions comme 3scale ( http://www.3scale.net ) qui permet de limiter le débit, d'analyser les données, etc. pour les API. Il fonctionne à l'aide d'un plugin (voir ici pour le fichier plugin api ruby ) qui s'accroche à l'architecture 3scale. Vous pouvez également l'utiliser via varnish et faire en sorte que varnish agisse comme un proxy limitant le débit.

2voto

Denis Hennessy Points 3085

Je vous recommande de mettre en place des limites de débit en dehors de votre application, sinon le trafic élevé aura toujours pour effet de tuer votre application. Une bonne solution est de l'implémenter en tant que partie de votre proxy apache, avec quelque chose comme mod_evasive

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X