【问题标题】:Use sidekiq to limit request through Net::http request通过 Net::http 请求使用 sidekiq 限制请求
【发布时间】:2023-03-27 11:17:01
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails httprequest sidekiq


    【解决方案1】:

    Sidekiq 没有办法限制外部操作的速率。 Sidekiq Enterprise 提供了一个速率限制 API,可以满足您的需求。

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

    【讨论】:

      【解决方案2】:

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

          ---
          :concurrency: 5
      

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          这表明您需要使用分布式信号量来实现解决方案。有许多提供此类功能的库和服务。

          这里是 an example 用于 Redis。

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

          【讨论】:

            猜你喜欢
            • 2014-08-19
            • 1970-01-01
            • 1970-01-01
            • 2016-06-11
            • 2010-09-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-30
            相关资源
            最近更新 更多