Как ограничить скорость 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Больше подробностей.

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