【发布时间】:2017-06-04 05:17:33
【问题描述】:
这是我的第一个 Catalyst 应用程序,我不确定如何解决以下问题。
用户在表单中输入一些数据并选择一个文件(最大 100MB)进行上传。提交表单后,实际计算最多需要 5 分钟,并将结果存储在 DB 中。
我想要做的是在后台中运行这个过程(也许还有文件上传)以避免服务器超时。应该向用户提供某种反馈(例如消息“工作已开始”或进度条)。作业仍在运行时应阻止表单。作业完成后应显示结果页面。
在阅读数小时后,我偶然发现了异步请求、作业队列、守护进程、Gearman 或 Catalyst::Plugin::RunAfterRequest 等概念。
你会怎么做? 感谢您帮助网络开发新手!
PS:在我当前的本地应用程序中,工作是与 Parallel::ForkManager 并行完成的。对于真正的应用程序,是否建议使用像 Amazon EC2 这样的云计算服务?或者只是找一个提供多核服务器的主机?
【问题讨论】:
-
将上传作为异步请求进行是有意义的。返回一个作业 ID 并在完成后让操作在模型中设置一个标志。然后让您的页面定期异步轮询后端(例如每 10 秒),如果它得到 done,则刷新页面。一会儿我会输入答案。
-
关于您的托管问题,这实际上取决于用例。亚马逊或其他云服务的优点是在必要时易于扩展,但除了其他考虑因素外,可能比拥有自己的服务器更昂贵。这个问题最好单独和其他地方发布。
-
@simbabque 如果你有时间,有用的工具/插件或一些示例代码的提示会非常有帮助。感谢 bytepusher,我会在应用投入生产时考虑
-
下面 Julien 的回答对纯后端很有帮助。但我们需要知道更多。您正在谈论并行处理之类的东西。你的申请有学术研究背景吗?如果因为用户不多而需要一段时间可以吗?还是这是商业广告,应该尽可能快?
-
这是一个用于研究目的的生物信息学应用程序。也许以后也用于商业用途。基本上它在一个大文件中搜索文本字符串,提取序列,将结果存储在数据库中,并将它们可视化。在初始阶段,该应用程序将主要由 1 或 2 人同时使用。无论如何,在我的本地开发环境中,我使用 ForkManager 的 32 个线程,因此一次运行大约需要。 1分钟没问题。如果任务没有并行化,计算量会增加七倍。
标签: perl asynchronous cloud daemon catalyst