当使用`stream_to`选项时,如何限制HTTPoison或hackney的速率

时间:2018-07-16 14:22:32

标签: http elixir httpoison

我有一个使用分块HTTP响应的客户端。

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

但是,HTTPoison能够比我们更快地将消息发送到进程。进程邮箱最多收到3万条消息,并占用了我们的所有内存。 是否有任何方法可以限制HTTPoison获取和转发响应主体到此过程的速率。

如果提供更多选项,很高兴进入erlang / hackney界面。

1 个答案:

答案 0 :(得分: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.requestHTTPoison.stream_next的文档。