1
votes

Utilisez sidekiq pour limiter la requête via la requête Net :: http

Dans mon application rails, je dois appeler une API http à une autre adresse (appelez-la simplement "Serveur A"), mais le serveur A ne peut pas traiter trop de requêtes en même temps. Je dois donc limiter les requêtes de mon application rails en utilisant une file d'attente ou un pool de connexions, ou quelque chose du genre. J'utilise d'abord sidekiq, mais il n'y a pas de bon moyen d'attendre que sidekiq complet dans les rails (je dois répondre à la demande de rails intérieurs, cette demande peut prendre un peu plus de temps mais c'est ok). Quelqu'un peut-il me suggérer une solution à cette situation?


0 commentaires

4 Réponses :


0
votes

Vous pouvez définir la concurrence dans sidekiq dans config / sidekiq.yml

    ---
    :concurrency: 5

afin qu'il n'y ait pas plus de 5 requêtes en même temps et que d'autres attendront dans la file d'attente jusqu'à ce qu'un processus soit terminé


0 commentaires

1
votes

Sidekiq n'a pas de moyen de limiter les opérations externes. Sidekiq Enterprise propose une API de limitation de débit qui fera ce dont vous avez besoin.

https://github.com/mperham/sidekiq/wiki / Ent-Rate-Limiting # concurrent


0 commentaires

0
votes

Si vous pouvez changer de client HTTP, Typhoeus a une fonctionnalité pour limiter le nombre de requêtes HTTP. Quand plus de requêtes que cela sont en file d'attente, hydra les enregistrera pour plus tard et démarrera les requêtes lorsque d'autres seront terminées.

https://github.com/typhoeus/typhoeus#specifying-max-concurrency


0 commentaires

0
votes

Sous l'hypothèse que vous avez déclaré qu'il est normal pour vous de bloquer la demande jusqu'à ce que vous soyez dans votre limite de débit (une hypothèse très discutable à mon avis), alors vous aurez essentiellement besoin d'un moyen de coordonner le blocage entre vos processus de travail Rails tentative d'opération.

Cela me suggère que vous devez implémenter une solution utilisant un sémaphore distribué. Il existe un certain nombre de bibliothèques et de services qui offrent une telle fonctionnalité.

Voici un exemple pour Redis.

Mais sachez que vous pouvez finir par bloquer tous vos collaborateurs et empêcher votre application de répondre si vous ne faites pas attention lors de la conception de votre solution.


0 commentaires