1

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

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

然而,HTTPoison 能够比我们处理它们更快地向进程发送消息。进程邮箱正在接收多达 30K 条消息并使用我们所有的内存。有没有办法限制 HTTPoison 获取并将响应正文转发到此进程的速率。

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

4

1 回答 1

3

您可以通过传入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

于 2018-07-16T14:43:26.557 回答