如何在Rails中使HTTP请求在仍然提供每分钟许多请求的同时?
-
21-12-2019 - |
题
我正在尝试扩展app服务器来处理每分钟20,000多个请求。
当我压力测试请求时,大多数请求都很容易处理20,000 rpm或更多。
但是,需要进行外部HTTP请求(例如,Facebook登录)的请求将服务器降至爬行(3,000 rpm)。我在概念上了解我当前环境的限制 - 3个负载平衡服务器,每个服务器只有4个独角兽工作者只能在一次执行12个请求,即使它们都在等待HTTP请求。
我的选择更好的是什么?我想立刻处理更多的连接。
可能的解决方案,因为我理解它:
-
蛮力:使用更多的独角兽工作者(即更多RAM)和更多服务器。
-
将所有阻塞操作推入背景/工人流程以释放Web进程。客户需要定期调查,以查找他们的请求完成后。
-
移动到puma而不是独角兽(可能是从mri的rubinius),这样我就可以使用线程而不是进程 - 哪些可能(??)提高每个连接的内存使用情况,因此允许数量工人增加。
从根本上说,我正在寻找的是:有没有更好的方法来增加一个封锁/排队请求的单个工作者可以处理的方法,这样我可以增加每个服务器的连接数?
例如,我听说讨论使用enfumachine使用薄。这是否可以打开可以放下它目前正在处理的Web请求的Rails工作者的可能性(因为那个是在外部服务器上等待),然后在它等待时拾取另一个请求?如果是这样,与独角兽和彪马相比,这是一个值得追求性能的途径吗? (它是否强烈依赖于应用程序的运行时活动?)
解决方案
Unicorn是一个单线程,多过程同步应用程序服务器。这类处理并不是一个很好的匹配。
听起来您的应用程序是I / O绑定。这争论以活动为导向的守护程序来处理您的请求。
我建议尝试eventMachine和EM-HTTP-Request和 Em-http-server 。不隶属于 StackOverflow