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

また、2 つの接続を持つコネクタを使用して Rainbows サーバーを起動してい:EventMachineます (つまり、一度に 2 つの HTTP 要求を処理する 2 つのファイバーを意味します)。

ここで、4 つの同時要求を行った場合、アプリは最初に 2 つを管理する必要があり、外部 API 呼び出しが行われている場合、これらのファイバーは、外部呼び出しが完了するのを待っている間に 2 つの新しい http 要求を管理できるはずですよね?

これは起こっていません。slowapi 呼び出しが返されてファイバーが解放されるまで、新しい http 要求は受け入れられません。

これは正しい動作ですか?何か不足していますか?ありがとう。

4

1 に答える 1

1

実際、これは正しい動作でした。

2 つのファイバーを使用して 2 つの http リクエストを処理するように Rainbows を構成する場合、実際には、受信する http リクエストの数が 2 に制限されることを意味します。

そのため、遅い API が呼び出されている間にファイバーによって使用されるリソース (メモリ、ファイル、データベース接続など) は無料ですが、サーバーは 2 つを超える http 接続を受け入れておらず、これらの無料のファイバーは実際には何も処理できません。

Rainbows は、ドキュメントでこれをより明確に指摘する必要があります。メールを送信します。

これが誰かに役立つことを願っています。

于 2014-01-23T14:51:36.240 に答える