【问题标题】:Separated threads according to url path根据 url 路径分隔线程
【发布时间】:2023-03-06 17:18:02
【问题描述】:

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

我想分开我的 url 请求。

第一个用于 api 请求,第二个用于其他请求。

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

我在这里的主要观点是为我的用户最需要的 url 请求“保存”一个线程。

谢谢你的光。

【问题讨论】:

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


    【解决方案1】:

    由于 Puma 考虑单独线程中的每个请求,这里唯一的瓶颈是这些线程的数据库访问。除此之外,您不能保证某些线程比其他线程“更好”。

    这里值得注意的一个可能的解决方案是使用nginx 处理它。假设您的应用在http://some_host.com 上提供内容,而APIhttp://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 处理。

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

    【讨论】:

    • 感谢您的快速答复!在切换到 Puma 之前,我使用了带有 2 个实例的 Passenger(就像你为 Puma 描述的那样),但在我看来,这不是最好的方法。我觉得有点脏。关于some_host.comsome_host.com/api,我完全有你所说的。 API 请求正在进行流式传输,我无法缓存这些数据,因为它始终是新内容。我想确保网络请求不会阻塞流式传输(例如在上传大文件期间)。
    • 我明白了,有趣的案例。你直播什么?
    • 音乐、视频以及即将推出的许多新内容。
    【解决方案2】:

    为什么不拆分主应用程序和 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'前缀。

    【讨论】:

      猜你喜欢
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 2014-07-29
      • 2021-12-06
      • 1970-01-01
      • 2011-10-30
      相关资源
      最近更新 更多