2

我无法理解使用带有 eventmachine 的纤维模型调用外部 API 时发生的情况。我在 Sinatra 中有这段代码:

get '/' do
  conn = Faraday.new 'http://slow-api-call' do |con|
    con.adapter :em_http
  end
  resp = conn.get
  resp.on_complete {
    request.env['async.callback'].call(resp)
  }
  throw :async
end

此外,我正在使用:EventMachine具有 2 个连接的连接器启动 Rainbows 服务器(这意味着 2 个光纤一次处理 2 个 http 请求)。

现在,如果我发出 4 个并发请求,应用程序首先应该管理 2 个,当进行外部 API 调用时,这些纤程应该能够在等待外部调用完成时管理 2 个新的 http 请求,对吧?

这没有发生。在 slowapi 调用返回并释放 Fiber 之前,不会接受新的 http 请求。

这是正确的行为吗?我错过了什么吗?谢谢。

4

1 回答 1

1

实际上,这是正确的行为。

当配置 Rainbows使用 2 个 fiber 处理 2 个 http 请求时,实际上意味着传入的 http 请求数被限制为 2。

因此,调用慢速 API 时纤程使用的资源是空闲的(内存、文件、数据库连接等),但服务器不接受超过 2 个 http 连接,这些空闲纤程实际上无法处理任何内容。

Rainbows 应该在文档中更清楚地指出这一点。会给他们发邮件。

希望这可以帮助某人。

于 2014-01-23T14:51:36.240 回答