我正在使用carrierwave 上传视频文件并使用Transloadit 对视频进行编码。在延迟工作的轨道上执行此操作的最佳方法是什么。请建议。
2 回答
有很多选择(纯粹是 HTTP 方面的事情,甚至没有谈论编程语言)。
问题实际上取决于您的环境、技能、支持等。我在“现实世界”中注意到的是,如果您通过 HTTP 请求向服务器发送 >100MB 的信息,它将失败。您的客户端很可能具有非常糟糕的上传速度(大多数 soho 互联网连接下降 > 10M 但 <1M 上升),因此您最终会遇到超时(路由器/nat 表/防火墙/网络服务器/脚本)。
1) 非常大的 POST(不好的做法,可能会消耗大量内存,失败意味着您必须重新开始并使服务器对 DDoS 开放)
2) 为 Apache/nginx 使用“上传模块”(需要编译,而且设置起来通常很头疼,但效果很好,可能不适用于所有托管情况)
3) 在您的客户端和服务器脚本中进行流式传输。效果很好。我还建议将您的上传分块到 <10MB,当它们失败时,重新启动块的可能性。
我对 DJ 的经验并不多,但背景处理对所有工具都有类似的方法。
首先,您应该将文件上传到某个地方(文件系统、Amazon S3 等)。DJ 不会处理这个任务。您应该在控制器操作中执行此操作。
然后,上传后您可以创建 DJ 任务,对您的视频进行编码并执行其他相关任务。
例如,您可以在视频模型中提交后运行 DJ,例如
class Video < AR::Base
after_commit :encode_in_background
private
def encode_in_background
self.delay.encode(id)
end
def encode
# code that runs in background
end
end
我的示例可能有不正确的语法,但主要思想是您通过控制器上传视频,然后运行后台处理作业。