【问题标题】:How do I make HTTP requests in Rails while still servicing many requests per minute?如何在 Rails 中发出 HTTP 请求,同时仍然每分钟处理许多请求?
【发布时间】:2014-02-27 02:51:22
【问题描述】:

我正在尝试扩展应用服务器以每分钟处理超过 20,000 个请求。

当我对请求进行压力测试时,大多数请求都能轻松处理 20,000 RPM 或更多。

但是,需要发出外部 HTTP 请求的请求(例如,Facebook 登录)会使服务器陷入爬行状态(3,000 RPM)。

我从概念上理解我当前环境的局限性——3 个负载平衡的服务器,每台服务器有 4 个独角兽工作者,一次只能处理 12 个请求,即使它们都在等待 HTTP 请求。

我有哪些选择可以更好地扩展它?我想一次处理更多的连接。

据我所知可能的解决方案:

  1. 蛮力:使用更多的独角兽工作者(即更多的 RAM)和更多的服务器。

  2. 将所有阻塞操作推入后台/工作进程以释放 Web 进程。客户需要定期轮询以了解他们的请求何时完成。

  3. 移到 Puma 而不是 Unicorn(可能从 MRI 移到 Rubinius),这样我就可以使用线程而不是进程——这可能(??)提高每个连接的内存使用率,因此允许增加工人。

从根本上说,我正在寻找的是:有没有更好的方法来增加单个工作人员可以处理的阻塞/排队请求的数量,以便我可以增加每台服务器的连接数?

例如,我听说过将 Thin 与 EventMachine 结合使用的讨论。这是否开启了 Rails 工作人员可以放下当前正在处理的 Web 请求(因为该工作人员正在外部服务器上等待)然后在等待时接收另一个请求的可能性?如果是这样,与独角兽和彪马相比,这是一个值得追求的性能途径吗? (它是否强烈依赖于应用程序的运行时活动?)

【问题讨论】:

    标签: ruby-on-rails concurrency unicorn puma


    【解决方案1】:

    Unicorn 是一个单线程、多进程同步的应用服务器。不太适合这种处理方式。

    听起来您的应用程序受 I/O 限制。这主张使用面向事件的守护进程来处理您的请求。

    我建议尝试 EventMachine 和 em-http-request 和 em-http-server

    这将允许您异步处理对 http 服务器的传入请求和传出 HTTP 服务调用。

    【讨论】:

      猜你喜欢
      • 2016-01-27
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      • 2018-01-19
      相关资源
      最近更新 更多