Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 处理Unicorn中的长请求+;Rails应用程序_Ruby On Rails_Web Services_Node.js_Nginx_Unicorn - Fatal编程技术网

Ruby on rails 处理Unicorn中的长请求+;Rails应用程序

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应用程序,可以在Unicorn(2个工人)和nginx上运行。我们希望集成一个第三方API,其中处理单个请求需要1到20秒。如果我们只是创建一个新的控制器来代理该服务,那么整个应用程序都会受到影响,因为通过我们的API向该服务发出请求只需要两个人,其余的用户在20秒内无法访问我们应用程序的其余部分

我们正在考虑两种解决方案

  • 创建一个单独的node.js服务器,该服务器将执行对第三方API的所有请求。在这种情况下,我们将仅使用Rails进行身份验证/授权,并且我们将使用X-Accel-redirect头通过nginx将请求重定向到节点(如下所述)
  • 将独角兽替换为瘦或彩虹!并在我们的Rails应用程序中保持代理,这样我们就可以处理更多的并发连接
  • 哪种解决方案可能会更好?或者我们还能做些什么

    我个人认为节点甚至循环更适合这里的工作,因为在选项2中,我们仍然会阻塞许多线程并等待HTTP请求完成,而在选项1中,我们可以在等待慢速请求完成的同时执行更多请求


    谢谢

    您可以在现有的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