【问题标题】:How to make async requests using HTTPoison?如何使用 HTTPoison 发出异步请求?
【发布时间】:2019-01-14 11:08:45
【问题描述】:

背景

我们有一个每秒处理大量请求的应用。此应用需要通过 HTTPS 向我们的一台服务器发出 GET 调用来通知外部服务。

目标

这里的目标是使用 HTTPoison 发出异步 GET 请求。我并不真正关心请求的响应,我只关心它们是否失败,因此我可以将任何可能的错误写入记录器。

如果成功了,我什么都不想做。

研究

我查看了 HTTPoison 的官方文档,发现它们支持异步请求:

https://hexdocs.pm/httpoison/readme.html#usage

但是,我对这种方法有 2 个问题:

  1. 他们使用flush 表示请求已完成。我无法登录应用程序并手动flush 来查看请求的进展情况,这太疯狂了。
  2. 当我们收到响应或错误时,它们不会显示任何通知机制。

所以,我有一个简单的问题:

  1. 如何异步通知我的请求失败或成功?

我假设默认的HTTPoison.get 是同步的,如文档中所示。

【问题讨论】:

    标签: asynchronous elixir httpoison


    【解决方案1】:

    这可以通过为每个请求生成一个新进程来实现。考虑类似的事情:

    notify = fn response ->
      # Any handling logic - write do DB? Send a message to another process?
      # Here, I'll just print the result
      IO.inspect(response)
    end
    
    spawn(fn ->
      resp = HTTPoison.get("http://google.com")
      notify.(resp)
    end) # spawn will not block, so it will attempt to execute next spawn straig away
    
    spawn(fn ->
      resp = HTTPoison.get("http://yahoo.com")
      notify.(resp)
    end) # This will be executed immediately after previoius `spawn`
    

    请查看我在这里指出的spawn/1 的文档。

    希望有帮助!

    【讨论】:

    • 我建议至少使用Task.start_link 而不是spawn - spawn 不会将创建的进程链接到任何东西,所以如果它意外失败,你永远不会发现。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多