使用sidekiq通过Net::http请求限制请求

Use sidekiq to limit request through Net::http request

在我的rails应用中,我需要在其他地址调用一个httpAPI(就叫它"Server A"),但是服务器A不能同时处理太多请求时间。所以我需要通过使用队列或连接池或类似的东西来限制来自我的 rails 应用程序的查询。首先我使用sidekiq,但是没有一个好的方法来等待rails中的sidekiq完成(我需要在rails请求中响应,这个请求可能需要更长的时间但是没关系)。谁能建议我针对这种情况的解决方案?

你可以在config/sidekiq.yml

中的sidekiq中设置并发
    ---
    :concurrency: 5

所以不会同时有超过5个请求,其他人会在队列中等待直到一个进程完成

Sidekiq 没有办法对外部操作进行速率限制。 Sidekiq Enterprise 提供速率限制 API,它将满足您的需要。

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

如果您可以切换 HTTP 客户端,Typhoeus 有一个功能可以限制 HTTP 请求 count.When 比排队的请求多,hydra 会保存它们以备后用,并在其他请求完成时启动请求。

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

假设您声明在您的速率限制内阻止请求是可以的(我认为这是一个非常可疑的假设),那么您基本上需要一种方法来协调您的 Rails 尝试操作的工作进程。

我认为您需要使用分布式信号量实现解决方案。有许多库和服务提供此类功能。

这是 Redis 的 an example

但请注意,如果您在设计解决方案时不小心,最终可能会阻止所有工作人员并使您的应用程序无响应。