Как ограничить скорость, с которой HTTPoison или hackney передает ответ при использовании параметра `stream_to`

У меня есть клиент, использующий фрагментированный HTTP-ответ.

HTTPoison.request(method, url, body, headers, stream_to: self(), timeout: 50_000, recv_timeout: 50_000)

Однако HTTPoison может отправлять сообщения процессу быстрее, чем мы можем их обработать. Почтовый ящик процесса получает до 30 тысяч сообщений и использует всю нашу память. Есть ли способ ограничить скорость, с которой HTTPoison извлекает и пересылает тело ответа этому процессу.

С удовольствием перейду к интерфейсу erlang/hackney, если он предоставляет больше возможностей.


person Peter Saxton    schedule 16.07.2018    source источник


Ответы (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 для получения более подробной информации.

person Dogbert    schedule 16.07.2018