【问题标题】:Is it possible to load-balance requests in phusion passenger based on params?是否可以根据参数对 phusion 乘客中的请求进行负载平衡?
【发布时间】:2019-01-31 20:38:17
【问题描述】:

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

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

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

这可以通过 Rabbit MQ 或其他类似方法实现,甚至可以通过 phusion 之外的离散编程来实现,但在我的情况下,有一种方法可以直接从应用程序配置或任何其他想法中实现这一点将是有趣和实用的。

为了让事情更清楚一点,资源变量可以有大约 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

由于请求几乎是随机到达的,因此进程的数量不应在某一时刻如此之多。

【问题讨论】:

  • 您如何运行您的乘客 - 在 apache/nginx 内或使用反向代理独立运行?
  • 在这种情况下,在 nginx 内部。

标签: ruby-on-rails nginx passenger


【解决方案1】:

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

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

【讨论】:

  • 也许我没有添加所有信息(我将编辑问题)。对于应用程序数量较少的情况,答案是可行的。已经从 [phusion docs(phusionpassenger.com/library/indepth/ruby/…) 研究了这种方法。但是考虑更多的资源(如问题中所述),在 50 到 1000 之间,我不知道完整列表。
猜你喜欢
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
相关资源
最近更新 更多