Как ограничить скорость HTTPoison, или хакни, потокового ответа при использовании опции `stream_to`
У меня есть клиент, использующий фрагментированный HTTP-ответ.
HTTPoison.request(method, url, body, headers, stream_to: self(), timeout: 50_000, recv_timeout: 50_000)
Однако HTTPoison может отправлять сообщения процессу быстрее, чем мы можем их обработать. Почтовый ящик процесса получает до 30 тыс. Сообщений и использует всю нашу память. Есть ли способ ограничить скорость, с которой HTTPoison извлекает и перенаправляет тело ответа этому процессу.
Рад перейти на интерфейс erlang/hackney, если это открывает больше возможностей.
1 ответ
Вы можете получить полный контроль над потоковым запросом, передав async: :once
в параметрах запроса, а затем с помощью HTTPoison.stream_next/1
просить больше кусков.
response = HTTPoison.request!(
method,
url,
body,
headers,
stream_to: self(),
async: :once, # <-
timeout: 50_000,
recv_timeout: 50_000
)
Вы получите один кусок ответа на данный момент. Когда вы обработаете это, вы можете запросить больше кусков, как это:
{:ok, response} = HTTPoison.stream_next(response)
receive do
...
end
пока, наконец, вы не получите %HTTPoison.AsyncEnd{}
,
Смотрите документацию HTTPoison.request
а также HTTPoison.stream_next
Больше подробностей.