根据url路径分隔线程

时间:2014-10-28 16:03:00

标签: ruby-on-rails multithreading nginx puma rubinius

我使用Puma和Nginx来运行我的Rubinius应用程序。

我想分开我的网址请求。

第一个是api请求,第二个是其他请求。

我认为Puma已经进行了线程化,但我想确保Web请求不会阻止线程在我的api请求期间导致停止。我想如果一个线程忙,Puma会创建另一个,但我想确保一个总是可用于api请求。

我的主要观点是"保存" url请求的线程,这是我的用户最需要的。

谢谢你的光明。

2 个答案:

答案 0 :(得分:0)

由于Puma考虑了分离线程中的每个请求,因此这里唯一的瓶颈是这些线程的数据库访问。除此之外,你无法保证某些线程比其他线程“更好”。

值得注意的一个可能的解决方案是使用nginx来处理它。假设您的应用正在http://some_host.com上提供内容,而API中的内容可在http://some_host.com/api内使用。您可以将nginx配置为分别处理http://some_host.comhttp://some_host.com/api的请求。在这种情况下,您将需要两个独立的Puma服务器实例。一个用于基本应用,一个用于api请求。我在这里的意思是当请求来到http://some_host.com时,它由Puma A处理,何时由http://some_host.com/api/...处理,由Puma B处理。

记住一件事,你可以通过分离的实例来处理请求,但是你仍然只有一个数据库,除非你正在缓存内容。这是另一个问题。你缓存你的内容了吗?如果没有,首先从缓存开始不是更大的想法吗?

答案 1 :(得分:0)

为什么不拆分主应用程序和API?使用Nginx很容易为两个不同的应用程序提供服务:

  location / {
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto $scheme;
    proxy_set_header  Host $http_host;
    proxy_redirect    off;
    proxy_pass        http://puma1;
  }


  location /api/ {
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto $scheme;
    proxy_set_header  Host $http_host;
    proxy_redirect    off;
    proxy_pass        http://puma2/;
  }

请注意第二个位置proxy_pass的尾部斜杠,它有助于重写请求并省略'/ api'前缀。