【问题标题】:Can I use celery to handle the process of upload file to third-party server?我可以使用 celery 来处理上传文件到第三方服务器的过程吗?
【发布时间】:2021-10-14 01:16:08
【问题描述】:

假设我有一个 Django 应用程序,它从用户那里获取帖子并使用 API 调用将它们上传到第三方存储。

现在,这些用户仅在每天的特定时间段内访问服务器,假设时间为 11:00 到 11:20。最大请求数可达 3000(最少 2500 个),即在 20 分钟内将向服务器发出 3000 个 POST 请求。每个请求都会使用 API 将 5-10 mb 的文件发布到第三方存储。我计算了这个 POST 到 API 的平均时间是 5 秒(平均)。处理此 POST 请求的 Django 视图的返回响应在文件上传发生时停止。

现在,如果我以这样一种方式设置 celery,当用户在服务器上进行 POST 时,我会验证该帖子并将上传部分移交给 celery,同时我的 Django 继续处理其他请求,以便为用户保持流畅的操作,同时Celery 负责一一上传所有文件。

我可以这样做吗?

如果可以的话,它的缺点是什么?

会不会有丢失部分文件上传的情况?

我是 celery 的新手,不太清楚事情是如何发生的。所以,我希望社区能帮助我。

提前谢谢你。

【问题讨论】:

  • 我认为您应该在应用程序处理请求之前处理文件上传过程。因为根据您在帖子中的描述,文件在一个请求中上传了两次 1. 文件已上传到您的服务器 2. 您将文件上传到了第三方服务器。为什么不直接上传到第三方服务器?
  • 是的,文件将直接上传到第 3 方服务器(我已经编辑了问题)。但我主要担心的是如果我使用 celery 将文件上传到第 3 方服务器会丢失文件让 Django 只处理请求。
  • 当然,您可以使用 celery 将文件上传到第三方服务器。但我想知道你是如何将文件从用户的计算机放到你的服务器的?我无法弄清楚这个过程。
  • 是的,只有在我们执行 model_object.save() 时才会将文件上传到第三方服务器。所以,我打算将model_object发送到celery,它可以对其执行保存操作。
  • 调用model_object.save()时文件的二进制数据已经上传到你的服务器。你应该避免这个过程

标签: django server celery virtual-machine django-celery


【解决方案1】:

最好的解决办法是

  1. 通过js逻辑上传网页中的文件,第三方文件服务器会返回一个文件数据的id(或url)。
  2. 然后您将带有文件 url 的数据发布到您的应用程序并保存。

我建议你不要使用 celery 来处理文件上传的过程

因为如果你引入Celery,你需要一个broker(保存消息eg:RabbitMQ or else),处理请求的过程会分开两个子过程。一个进程被同步处理,另一个被异步处理。如果没有其他工具,您将无法保持数据一致性

【讨论】:

  • 是的,使用 JS 上传看起来是一种可能的解决方案。谢谢你的想法。我会看看我的存储API是否可以使用JS访问并评论回来。
  • 使用 Javascript 上传是一种选择,但它会使我的 API 凭据公开,一些用户可以利用它并更改其中的内容。
  • @PinjarlaGirish 安全问题可以通过多种方式解决。比如ACL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多