Question

Je suis en train de mettre sur pied une API REST et, comme je ne sais pas comment elle va évoluer ni quelle sera la demande, j'aimerais pouvoir évaluer les utilisations limitées de celle-ci ainsi que pouvoir temporairement refuser les demandes lorsque la boîte est saturée ou s'il existe une sorte de scénario en barre oblique.

Je voudrais également pouvoir interrompre temporairement le service (tout en donnant aux clients des résultats indiquant que le service principal est un peu déconnecté) lorsque / si je dois adapter le service en augmentant la capacité.

Existe-t-il des meilleures pratiques pour ce genre de chose? L'implémentation est Rails avec mysql.

Était-ce utile?

La solution

Tout cela est fait avec le serveur Web externe, qui écoute le monde entier (je recommande nginx ou lighttpd).

En ce qui concerne les limites de débit, nginx peut limiter, c’est-à-dire 50 req / minute par IP, le tout sur 503 pages, que vous pouvez personnaliser.

En ce qui concerne les pannes temporaires prévues, dans le monde des rails, cela se fait via la page spéciale de maintenance.html. Il existe une sorte d'automatisation qui crée des liens symboliques ou ce lien lorsque des serveurs d'applications rails tombent en panne. Je vous recommande de ne pas vous fier à la présence de fichier, mais à la disponibilité réelle du serveur d'applications.

Mais vous pouvez réellement démarrer / arrêter des services sans perdre aucune connexion. C'est à dire. vous pouvez exécuter une instance distincte du serveur d'applications sur un socket / port IP UNIX 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 ne sont servis qu'avec une nouvelle. Aucune connexion perdue. Bien sûr, ce scénario n’est pas toujours possible, dépend du type de changement que vous avez introduit dans la nouvelle version.

haproxy est une solution exclusivement équilibrante. Il peut équilibrer de manière extrêmement efficace les demandes adressées aux serveurs d'applications de votre batterie de serveurs.

Pour un service assez important, vous obtenez quelque chose comme:

  • api.domain résolu en équilibres round-robin N
  • chaque équilibreur envoie des requêtes aux serveurs Web pour les serveurs statiques et aux serveurs d'applications P pour le contenu dynamique. Eh bien, votre API REST n’a pas de fichiers statiques, n'est-ce pas?

Pour un service relativement réduit (moins de 2 000 tr / min), tout l’équilibrage est effectué sur un ou deux serveurs Web.

Autres conseils

Déjà de bonnes réponses - si vous ne souhaitez pas implémenter le limiteur vous-même, il existe également des solutions telles que 3scale ( http: / /www.3scale.net ) qui limite la vitesse, l’analyse, etc. des API. Cela fonctionne en utilisant un plugin (voir ici pour le le plugin ruby ??api ) qui s'accroche à l'architecture 3scale. Vous pouvez également l'utiliser via vernis et faire en sorte que vernis agisse comme un proxy limitant le débit.

Je vous conseillerais d'appliquer les limites de débit en dehors de votre application, sinon le trafic important aura toujours pour effet de tuer votre application. Une bonne solution consiste à l'implémenter dans votre proxy Apache, avec par exemple mod_evasive

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top