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

Ruby on rails 使用sidekiq通过Net::http请求限制请求,ruby-on-rails,httprequest,sidekiq,Ruby On Rails,Httprequest,Sidekiq,在我的rails应用程序中,我需要在其他地址调用http API(只需将其称为“服务器a”),但服务器a不能同时处理太多的请求。因此,我需要通过使用队列或连接池或类似的方式限制来自rails应用程序的查询。首先,我使用sidekiq,但是在rails中等待sidekiq完成并不是一个好方法(我需要在rails内部响应请求,这个请求可能需要更长的时间,但它是可以的)。有人能为我推荐一个解决方案吗?您可以在config/sidekiq.yml中的sidekiq中设置并发性 --- :

在我的rails应用程序中,我需要在其他地址调用http API(只需将其称为“服务器a”),但服务器a不能同时处理太多的请求。因此,我需要通过使用队列或连接池或类似的方式限制来自rails应用程序的查询。首先,我使用sidekiq,但是在rails中等待sidekiq完成并不是一个好方法(我需要在rails内部响应请求,这个请求可能需要更长的时间,但它是可以的)。有人能为我推荐一个解决方案吗?

您可以在config/sidekiq.yml中的sidekiq中设置并发性

    ---
    :concurrency: 5

因此,在同一时间不会有超过5个请求,其他请求将在队列中等待,直到进程完成。

Sidekiq无法对外部操作进行分级限制。Sidekiq Enterprise提供了一个速率限制API,可以满足您的需要


如果您可以切换HTTP客户端,Typhous具有限制HTTP请求计数的功能。当排队的请求超过此数量时,hydra将保存它们以备以后使用,并在其他请求完成后启动请求


假设您声明您可以阻止请求,直到达到您的速率限制(我认为这是一个非常可疑的假设),那么您将需要一种方法来协调尝试操作的Rails工作进程之间的阻止

这向我建议,您需要使用分布式信号量实现一个解决方案。有许多库和服务提供这种功能

这是给Redis的

请注意,如果你在设计你的解决方案时不小心,你可以阻止所有的工作人员,使你的应用程序反应迟钝。