Волокна и множественные 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-соединений, и эти свободные волокна не могут ничего обработать.
Радуга должна указать это более четко в документации. Отправлю им письмо.
Надеюсь, это кому-нибудь поможет.