Волокна и множественные http запросы в Синатре

У меня проблемы с пониманием того, что происходит при вызове внешних API с использованием модели волокон с помощью Eventmachine. У меня есть этот код в Синатре:

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

Кроме того, я загружаю сервер Rainbows, используя :EventMachine разъем с 2 соединениями (это означает, что 2 волокна обрабатывают 2 HTTP-запроса одновременно).

Теперь, если я сделал 4 одновременных запроса, приложение должно сначала обработать 2, а когда выполняются внешние вызовы API, эти волокна должны иметь возможность управлять 2 новыми запросами http, ожидая завершения внешнего вызова, верно?

Этого не происходит. Новые запросы http не принимаются до тех пор, пока не будет возвращен вызов slowapi и не освободится Fiber.

Это правильное поведение? Я что-то пропустил? Благодарю.

1 ответ

На самом деле, это было правильное поведение.

При настройке Rainbows для обработки 2 http-запросов с использованием 2 волокон это фактически означает, что количество входящих http-запросов ограничено 2.

Таким образом, ресурсы, используемые волокнами при вызове медленного API, являются свободными (память, файлы, соединения с базой данных и т. Д.), Но сервер не принимает более двух http-соединений, и эти свободные волокна не могут ничего обработать.

Радуга должна указать это более четко в документации. Отправлю им письмо.

Надеюсь, это кому-нибудь поможет.

Другие вопросы по тегам