2

我们有一个在 Unicorn(2 个 worker)和 nginx 上运行的 Rails 应用程序。我们希望集成一个第 3 方 API,其中处理单个请求需要 1 到 20 秒。如果我们只是创建一个新的控制器来代理该服务,整个应用程序都会受到影响,因为只需要 2 个人通过我们的 API 向该服务发出请求,并且在 20 秒内其余用户无法访问我们的其余部分应用程序。

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

  1. 创建一个单独的 node.js 服务器,它将执行对 3rd 方 API 的所有请求。在这种情况下,我们只会使用 Rails 进行身份验证/授权,并且我们会使用 X-Accel-Redirect 标头通过 nginx 将请求重定向到节点(如此处所述http://blog.bitbucket.org/2012/08/24/隔离服务/
  2. 用瘦或彩虹替换独角兽!并继续在我们的 Rails 应用程序中进行代理,然后大概可以让我们处理更多的并发连接。

哪种解决方案可能会更好?或者还有什么我们可以做的。

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

谢谢!

4

2 回答 2

1

我们已经X-Accel-Redirect在生产中使用该解决方案一段时间了,它运行良好。

在服务器下的 nginx 配置中,我们有外部服务的条目(在我们的例子中是用 node.js 编写的),例如

server {
  ...
  location ^~ /some-service {
    internal;
    rewrite ^/some-service/(.*)$ /$1 break;
    proxy_pass http://location-of-some-service:5000;
  }
}

在 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 服务中。

于 2014-03-31T11:07:56.337 回答
0

您可以EventMachine在现有的 Rails 应用程序中使用,这意味着更少的重写。net/http您可以向EM::HttpRequestAPI 发出请求并添加回调,而不是向 API 发出请求。这类似于 node.js 选项,但不需要特殊的服务器 IMO。

于 2013-01-14T15:37:32.017 回答