如何在使用“stream_to”选项时限制 HTTPoison 或 hackney 流式传输响应的速率

How to limit the the rate HTTPoison, or hackney, streams a response when using the `stream_to` option

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

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

但是 HTTPoison 能够比我们处理它们更快地将消息发送到进程。进程邮箱正在获取多达 30K 条消息并使用我们所有的内存。 有什么方法可以限制 HTTPoison 获取响应主体并将其转发到此进程的速率。

很高兴进入 erlang/hackney 界面,如果它公开了更多选项。

您可以通过在请求选项中传递 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 and HTTPoison.stream_next 的文档。