1

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

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

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

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

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

据我了解,可能的解决方案:

  1. 蛮力:使用更多的独角兽工人(即更多的内存)和更多的服务器。

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

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

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

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

4

1 回答 1

2

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

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

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

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

于 2014-02-26T18:51:22.303 回答