【问题标题】:send_data can't send large file - after 30 seconds, kills the requestsend_data 无法发送大文件 - 30 秒后,终止请求
【发布时间】:2018-05-15 16:50:29
【问题描述】:

我在 nginx/unicorn 上有一个带有这行代码的 rails 应用程序:

    format.csv { send_data Test_Model.to_csv, stream: 'true', filename: "assets-#{DateTime.now.strftime('%Y%m%d%H%M%S')}.csv" }

问题是 - 我的 to_csv 方法生成的文件偏大,2.4 MB - 我的应用程序通过 sql 查询生成它也需要很长时间...而那种长久是我无法改变的。

那么,90% 的时间我都会调用我的功能:

也许 10 次中有 1 次,我确实让文件出来了。但重点是……生成它并通过 send_data 发送它会有很大的用处。

我知道有关于 send_file 的讨论。但是, send_file 需要一个已生成文件的文件路径。在这种情况下,我想用 send_data 动态创建这些数据。如果可能的话,我真的很想将此文件从 send_data 中推出 - 即使我的应用程序需要超过 30 秒以上的时间来生成文件。

更新

所以我的应用程序有点“超时”并在 30 秒时咬住灰尘。听起来很像某个地方的超时设置。我想知道 - send_data 超时会在 unicorn conf 中设置,还是在通用 rails conf 中设置? 如何操作与 send_data 关联的超时

【问题讨论】:

  • 我认为发送更大的文件没有任何问题(而且 2.4 MB 并不是那么大)。你用什么服务器?你能用curl -I http://yourpath 测试它并发布输出吗?来自浏览器的一般网络错误可以掩盖问题
  • 生成csv数据需要多长时间?
  • @23tux 生成需要几秒钟。大约 15-30 秒。
  • @23tux 啊 - 快速检查发现我的应用程序在 30 秒处超时。这是一个独角兽应用程序......也许有配置相关?我想知道那个配置网络服务器或 Rails 项目是否相关?我将在主线程中包含该问题,以及标记独角兽
  • 您的环境/服务器设置是什么?它是在开发模式还是生产模式下失败?

标签: ruby-on-rails ruby nginx unicorn


【解决方案1】:

Ngnix 将终止耗时过长的连接。长连接意味着您的应用程序可能无法处理其他请求。除了重写您的请求以使用 ActiveJob 或其他一些后台生成之外,您还可以检查 nginx 确认参数keepalive_timeout

【讨论】:

  • 是的,这就是如何改变它。我们将一些报告服务器设置为 60 甚至 90 秒。此外,这可能是浏览器本身的问题。通常对于大文件或需要一段时间处理的文件,我们会出于这个确切原因发出 AJAX 请求。
  • 嘿@John Naegle 我将 nginx.conf 中的 keepalive_timeout 设置更改为 90 秒,而不是默认的 5 秒。但是,我的请求仍然在 30 秒时被截断。现在试图找到相关的独角兽配置 - 奇怪的是,这个超时似乎是由除了恰当命名的 nginx 设置之外的东西控制的。
  • 如果 @PinkElephantsOnParade 浏览器相信连接,它们将为您超时。正如我在评论中提到的,您可以通过进行这些下载 ajax 调用来避免这种情况。虽然您可以控制浏览器的超时(如果要分发),但您可能无法控制他们的浏览器设置
  • @JohnNaegle 在这种情况下没有机架超时和 Heroku。有趣的认为它可能与浏览器有关。我会调查的。
【解决方案2】:

独角兽有timeout parameter

将工作进程的超时设置为+秒+。工人搬运 request/app.call/response 周期比这个时间长 period 将被强制终止(通过 SIGKILL)。这个超时是 由主进程本身强制执行,不受 工作进程的调度限制。由于复杂度低, 低开销实现,超过 3.0 秒的超时被认为是不准确和不安全的。

【讨论】:

    猜你喜欢
    • 2019-01-11
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多