【问题标题】:How to send a dynamically generated file that exceeds heroku 30 sec limit如何发送超过heroku 30秒限制的动态生成文件
【发布时间】:2023-03-29 10:30:02
【问题描述】:

我对我的 RoR 项目执行了一个操作,该操作会生成一个包含动态数据的大 zip,它需要的时间超过了 heroku 允许的 30 秒。 如果我将数据发送回客户端,Heroku 允许请求持续超过 30 秒,所以:

  1. 如何在服务器上处理数据时解决这个问题(我猜是某种 jquery 轮询)?
  2. 还是应该使用延迟作业将文件临时存储在 S3 上并传递 URL?将要使用一次的文件是否值得?

我的代码:

send_data(zip(@data), :filename => "name.zip", :type=>"application/zip")

【问题讨论】:

    标签: jquery ruby-on-rails heroku


    【解决方案1】:

    有几种方法可以避免可怕的 Heroku H12 request timeout error.

    有几种方法可以做到这一点。

    1. slacker 的方法是发回空格让 Heroku 知道你还活着并发送数据。您需要修改您的代码以每隔一段时间写入一个空格,但这足以防止 Heroku 超时,而且以后也不会干扰数据。您需要正确设置标头,因为在网络上发送数据后您无法修改标头。

    2. 您可以让您的客户端每隔几秒轮询一次(我强烈建议对几乎所有轮询的事物进行指数退避)。您需要创建一个新的端点,例如 /status,webapp 可以请求该端点。但是,这意味着当原始压缩文件请求完成时,服务器无法与客户端进行通信,因为连接早已被终止。因此,您将文件上传到 s3,然后当客户端要求 /status 时,您检查文件是否已上传到 s3,然后返回 url。

    如果您关心如何管理 S3 上的空间,我建议您查看S3 object expiration,它会在一定寿命后自动删除文件。

    【讨论】:

    • 是我可以为单个控制器操作实现的懒散方法吗?您能否参考一个如何实现 slacker 方法的示例?
    • 嗯。所以我没能找到关于空间方法的好文章。我建议你尝试一个简单的练习,通过发送一个空间,不关闭连接,休眠几秒钟,然后发回一个新空间,让请求保持打开很长时间。此请求将保持未完成,因为它将延长浏览器超时和 heroku 超时。从那里,您可以将其扩展为在发送回空间时压缩文件。不建议使用这种创可贴,因为迟早会遇到问题,因为它相当脆弱。
    • 您有任何关于如何通过发送空格保持连接打开的示例吗?
    猜你喜欢
    • 2019-10-08
    • 1970-01-01
    • 2021-11-28
    • 2011-09-03
    • 2020-11-13
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多