1

我们的 Rails Web 应用程序必须根据请求从 ftp 下载/解压缩包含 html 页面的档案,以便用户通过浏览器查看。

存档可能非常大,因此用户必须等到它在服务器上下载/解压缩。

我以在用户请求中调用 fork/Process.detach 的方式实现了进度条,以便他的请求完成,但下载/解包过程继续在后台运行。并且在他的浏览器中呈现的 javascript 会 ping 我们的服务器以获取状态,直到一切准备就绪,然后它将他重定向到解压缩的 html 页面。

只要用户请求一个存档,一切都会顺利进行,但如果他尝试同时运行 2 个或更多请求(以便启动更多分叉),似乎只有一个完成,其余的过期/次出局/被乘客杀死(?)。我想这是乘客/分叉的问题。

我不确定是否可以以某种方式修复它,所以我想我需要切换到另一个解决方案。该解决方案需要允许立即并行处理下载。因此,如果用户请求多个档案,他必须同时查看所有档案的下载/解压缩进度。

我正在考虑立即运行后台 rake 作业,但启动起来似乎很慢(我们的服务器上每分钟都会发生很多 cron rake 任务)。我喜欢 fork 的原因是它的启动速度非常快。我知道有延迟的工作,我们也大量使用它来完成其他任务。但是它可以在没有队列的情况下立即同时启动多个进程吗?

4

2 回答 2

1

通过保留叉子并使用单个 dj 工作人员来解决。这样,我可以根据需要同时启动尽可能多的进程,而不会遇到乘客/修改我们产品的 gemset 的问题(我们正试图避免这种情况,因为它在过去导致了错误)

不确定在 dj worker 内部分叉是否会导致任何麻烦,所以 在延迟工作中运行分叉时询问

如果 id 可以自由修改 gemset,id 可能会按照 wrdevos 的建议使用 resque、sidekiq 或 girl_friday(但可能性较小,因为它取决于运行的服务器)。

于 2012-12-24T04:30:53.657 回答
0

使用 Resque:https ://github.com/defunkt/resque

更多关于 bg 工作和 Resque 的信息。

https://github.com/blog/542-introducing-resque

于 2012-12-21T14:18:37.650 回答