如何在使用“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
的文档。
我有一个客户端使用分块的 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
的文档。