Ruby on rails 处理Unicorn中的长请求+;Rails应用程序
我们有一个Rails应用程序,可以在Unicorn(2个工人)和nginx上运行。我们希望集成一个第三方API,其中处理单个请求需要1到20秒。如果我们只是创建一个新的控制器来代理该服务,那么整个应用程序都会受到影响,因为通过我们的API向该服务发出请求只需要两个人,其余的用户在20秒内无法访问我们应用程序的其余部分 我们正在考虑两种解决方案Ruby on rails 处理Unicorn中的长请求+;Rails应用程序,ruby-on-rails,web-services,node.js,nginx,unicorn,Ruby On Rails,Web Services,Node.js,Nginx,Unicorn,我们有一个Rails应用程序,可以在Unicorn(2个工人)和nginx上运行。我们希望集成一个第三方API,其中处理单个请求需要1到20秒。如果我们只是创建一个新的控制器来代理该服务,那么整个应用程序都会受到影响,因为通过我们的API向该服务发出请求只需要两个人,其余的用户在20秒内无法访问我们应用程序的其余部分 我们正在考虑两种解决方案 创建一个单独的node.js服务器,该服务器将执行对第三方API的所有请求。在这种情况下,我们将仅使用Rails进行身份验证/授权,并且我们将使用X-Ac
谢谢 您可以在现有的Rails应用程序中使用
EventMachine
,这意味着更少的重写。您可以向API发出EM::HttpRequest
请求并添加回调,而不是向API发出net/http
请求。这类似于node.js选项,但不需要特殊的服务器。我们已经在生产中使用X-Accel-Redirect
解决方案一段时间了,它工作得很好
在服务器下的nginx配置中,我们有外部服务的条目(在本例中是用node.js编写的),例如
在rails中,我们对请求进行身份验证和授权,当我们想要将请求传递给其他服务时,在控制器中,我们执行如下操作
headers['X-Accel-Redirect'] = '/some-service'
render :nothing => true
现在,rails完成了对请求的处理,并将其交还给nginx。Nginx看到x-accel-redirect
头,并将请求重放到新的url-/some service
,我们将其配置为代理到node.js服务。Unicorn和rails现在可以处理新请求,即使node.js+nginx仍在处理原始请求
通过这种方式,我们将Rails用作应用程序的主要入口点和网关守护者,这就是进行身份验证和授权的地方。但我们能够在更合适的时候将许多功能转移到这些较小的、独立的node.js服务中。但这是否意味着Unicorn worker仍然被阻塞,等待EM回调,直到它能够将响应返回到浏览器?我不这么认为。对第三方Api的请求将位于Em.run块内,不会阻塞主线程或进程。稍后我将给出一个示例,但请尝试一下。Thin是使用Eventmachine编写的,因此,如果unicorn在EM::HTTP方面给您带来麻烦,请用Thin替换它。彩虹!我认为如果你只保留Unicorn并尝试使用EM,它无论如何都不会有帮助,因为它仍然只能处理2个并发请求。即使EM将执行异步HTTP请求,我的unicorn进程也必须阻塞并等待EM完成请求,以便它能够向浏览器响应结果。现在,如果我切换到不同的服务器,例如Puma或Thin,我现在可以通过使用线程处理更多的并发连接,但EM仍然没有任何帮助,因为这些线程必须坐在那里等待EM响应,然后才能响应浏览器。我现在在Rails 3应用程序中面临类似的问题。您有什么解决方案吗?如果您正在更改Web服务器,您可能会想签出puma,或者如果您对工作进行了后台处理,那么延迟的工作可能是最容易的?Node可能更好,我对此没有任何经验
headers['X-Accel-Redirect'] = '/some-service'
render :nothing => true