【问题标题】:%HTTPoison.Error{id: nil, reason: :closed}%HTTPoison.Error{id:无,原因::关闭}
【发布时间】:2017-03-28 12:52:35
【问题描述】:

我们在我们的代码库中使用 HTTPoison 来发布和获取请求,同时使用 hackney 池。在这里发帖只是因为我想从所有专家那里得到一些意见。

我们正在使用很多摄像头,我们从每个摄像头获取图像,然后将所有这些图像保存到 seaweedFS 服务器。

我们每秒发出近千个请求。在 seaweedFS 端,我们以 10 秒的超时时间启动了服务器。在我们的代码库方面,为了上传图片,我们使用了这个 hackney 配置。

  :hackney_pool.child_spec(:seaweedfs_upload_pool, [timeout: 5000, max_connections: 1000]),
  :hackney_pool.child_spec(:seaweedfs_download_pool, [timeout: 5000, max_connections: 1000]),

在过去的几天里,我们遇到了这个问题。起初,我们这边的 timeout 和 max_connections 是 10 秒和 5K。我们开始收到这些 HTTPoison 错误

{%HTTPoison.Error{id: nil, reason: :closed}}

错误计数如此之高,几乎达到 12K 等等,所以暂时,在 Elixir Slack 频道讨论后,我将 timeout 和 max_connections 更改为上述设置。在此之后,错误从 12K 减少到 3K,但仅持续 2 或 3 天,之后错误计数再次变为 12K,依此类推。

开发SeaweedFS的人,指出我们用来发送HTTP请求的库没有关闭连接,并且在我们的seaweedFS服务器端(我们的代码库向其发送读写请求的服务器)的结果这个命令是

root@Ubuntu-1404-trusty-64-minimal ~ # netstat | grep http | wc -l
5086

谁能给我一些建议?这个错误的原因可能是什么?

我对 Elixir Slack Channel 以及我所知道的关于 hackney 池的讨论很少为此请求建立的连接将保持打开状态另外 2 秒(完成 5 秒),以便其他 http post 请求可以使用仍然打开的连接?也许我在这个理论上错了。

但是,如果有人能指出一些使用 hackney 池的更好解决方案,那就太好了。

我们使用的是 HTTPoison 0.11.1,最终使用的是 hackney 1.7.1。

【问题讨论】:

    标签: elixir phoenix-framework httpoison


    【解决方案1】:

    我遇到了以下错误:

     test login  --core test (Devato.Features.IndexPageTest)
     test/devato_web/features/index_page_test.exs:13
     ** (RuntimeError) Wallaby had an internal issue with HTTPoison:
     %HTTPoison.Error{id: nil, reason: :timeout}
     stacktrace:
       (wallaby 0.23.0) lib/wallaby/httpclient.ex:37: Wallaby.HTTPClient.make_request/5
       (wallaby 0.23.0) lib/wallaby/experimental/chrome.ex:96: Wallaby.Experimental.Chrome.start_session/1
       (wallaby 0.23.0) lib/wallaby.ex:78: Wallaby.start_session/1
       (devato 0.1.0) test/support/feature_case.ex:25: Devato.FeatureCase.__ex_unit_setup_0/1
       (devato 0.1.0) test/support/feature_case.ex:1: Devato.FeatureCase.__ex_unit__/2
       test/devato_web/features/index_page_test.exs:1: Devato.Features.IndexPageTest.__ex_unit__/2
    

    我可以在无头 chrome 中运行测试,但我需要它才能工作,这样我才能看到它在浏览器上运行。对我有用的是配置超时

    Wallaby 0.23.0 添加如下配置:

    config :wallaby,
        hackney_options: [timeout: :infinity, recv_timeout: :infinity]
    

    覆盖一个值

    config :wallaby,
        hackney_options: [timeout: 5_000]
    

    【讨论】:

      猜你喜欢
      • 2020-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 2013-04-08
      • 2015-07-20
      • 1970-01-01
      相关资源
      最近更新 更多