在 Rails 响应中发送一些初步数据

Posted

技术标签:

【中文标题】在 Rails 响应中发送一些初步数据【英文标题】:Send some preliminary data in a rails response 【发布时间】:2014-06-22 18:27:55 【问题描述】:

在 Rails 中,是否可以分两部分将响应发送回浏览器? 第一部分不需要是任何特定的(原因如下所述)。响应的第二部分将是完整的正常响应,例如 .html.erb 格式的视图。

我希望这样做的原因是 Heroku 需要在 30 秒内将响应发送回浏览器,但是我的应用需要超过 30 秒才能对 120 万条记录执行数十次计算。

Heroku 文档表明这可能在某些平台上是可能的(但在 Rails 上可能吗?):https://devcenter.heroku.com/articles/limits

HTTP 请求有一个初始的 30 秒窗口,在该窗口中,Web 进程必须返回响应数据(完成的响应或 一些响应数据以表明该进程处于活动状态)。 在最初的 30 秒内不发送响应数据的进程 窗口将在其日志中看到 H12 错误。

P.S.- 我承认可能有比 Rails 更好的平台来构建这种数据密集型应用程序,但我在 Rails 中构建它是因为我知道这一点。

谢谢!

【问题讨论】:

似乎是 Heroku 的一个限制。你研究过流媒体吗? guides.rubyonrails.org/… 【参考方案1】:

正确的方法是使用background jobs,尤其是在 Heroku 上。如果您不想为额外的测功机付费,那么some hacks 可能对您有用。

如果您只是需要一起破解某些东西,streaming API 应该可以工作。您应该能够每 30 秒写一个空格,直到您的工作完成。请记住,您需要一种方法来中断长时间运行的任务以发送响应。这可能意味着支持线程的 Ruby 版本。

如果您只是从数据库中读取大量记录,您可以use find_each with streaming。

【讨论】:

感谢指向流 API 的指针。这似乎是要走的路。 我以前在 Heroku 上使用过后台作业,但从来没有使用过在作业完成后为浏览器呈现视图的任何后台作业。这可能吗? 通常您会使用重复的 ajax 请求来检查状态,然后在完成时重定向。这可能会有所帮助:***.com/questions/5042300/…

以上是关于在 Rails 响应中发送一些初步数据的主要内容,如果未能解决你的问题,请参考以下文章

RSpec在请求后发送原始JSON参数

是否有任何加密解密库在 jquery 和 rails 中工作相同?

如何通过 websockets 在 ruby​​ on rails 和 reactJS 之间发送数据

python 初步认识Flask

使用Savon和Nokogiri在Rails中解析XML SOAP响应的内存不足

Rails 5 成功发送数据后重新启用表单提交