如何在Rails中发出HTTP请求,同时仍然每分钟处理许多请求?

时间:2014-02-26 00:40:57

标签: ruby-on-rails concurrency unicorn puma

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

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

但是,需要发出外部HTTP请求的请求(例如,Facebook登录)会使服务器崩溃(3,000 RPM)。

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

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

Unicorn是一个单线程,多进程同步应用服务器。对于这种处理来说,这不是一个很好的匹配。

听起来您的应用程序受I / O约束。这要求面向事件的守护进程处理您的请求。

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

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