是否可以基于参数在乘机乘客中平衡请求?

时间:2019-01-31 09:48:59

标签: ruby-on-rails nginx passenger

我们假设应用程序接收到对有限数量的资源进行操作的请求,这些资源一次仅支持一种操作。一个例子是:

/GET do_stuff?resource=A&other_params
/GET do_stuff?resource=B&other_params

这个想法是,来自资源A的操作应该放在进程A中,而对B的请求应该放在过程B中。如果收到对资源A的任何其他请求,它应该在进程A中处于队列中。每个资源的操作模式。

这可以通过Rabbit MQ或其他类似方法,甚至可以通过非常规的离散编程来实现,但是对于我来说,有一种方法可以直接从应用程序配置或任何其他想法来实现,这将是有趣且实用的。

为了使情况更清楚一点,资源变量可以包含大约500个值,因此不适合使用硬编码或使用应用程序组名称选项。

逻辑本身应类似于:

incoming request 
      if there is a process that is running a request for the resource 
         put request into process queue
      else 
         spawn or use free process

由于请求将几乎在随机时间到达,因此进程数量不应在一瞬间过高。

1 个答案:

答案 0 :(得分:0)

乘客按请求队列平衡请求,每个应用程序组一个。文档here指出可以按服务器/位置/ if语句分配组,因此首先尝试的是nginx config,例如:

location /do_stuff {
  if($arg_resource ~ (A|B) ){
    passenger_app_group_name "some_appliation_group_key_for_resource_$arg_resource";
  }
}