c# - 架构: Handling large scale photo upload and resizing

标签 c# image-processing azure file-upload azure-blob-storage

我有一个系统,用户可以上传约 16 兆像素的全分辨率图像,这会导致文件很大。

当前的方法是:

  1. 接收 HTTP 请求中的上传内容。
  2. 在请求中,将原始文件写入 Blob 存储
  3. 仍然在请求范围内,以不同的分辨率制作约 10 份文件副本。 (这些是不同尺寸的缩略图,有些适用于 Hi-DPI(视网膜)设备,还有用于全尺寸查看的尺寸。我还将图像转换为 WebP。
  4. 然后,我将所有结果传输到不同区域的 Blob 存储以用于私有(private) CDN 目的。

显然,问题在于,由于这一切都是在 HTTP 请求中完成的,因此它比任何其他典型的 HTTP 请求消耗更多的服务器资源,特别是当用户开始批量上传图像(一次多个用户)时。如果用户上传大图像,内存消耗会急剧增加(我使用 ImageMagick.NET 进行图像处理)。

这样的架构是否更合适:

  1. 接收文件上传,写入 blob,向处理队列添加通知,向用户返回成功。
  2. 单独的工作服务器接收新文件的通知并开始所有调整大小、处理和复制。
  3. 我只是将客户端 JavaScript 设置为在几秒钟内不加载图像预览,或者在找不到图像时重试(这意味着图像仍在处理中,但可能很快就会显示) )。

至少这种新方法将更容易扩展,并且具有更可预测的性能。但仅仅处理像上传照片这样的“日常”事情似乎需要做很多工作。 有更好的方法吗?

我知道新方法遵循与使用外部调整大小服务相同的原则,但不想在内部执行此操作,因为我担心其中一些第三方服务的隐私。这仍然意味着我必须调整客户端来处理丢失/未处理的图像。

最佳答案

是的,你所描述的是一个更好的方法。这听起来更复杂,但这就是大多数可扩展站点处理大负载的方式。将其卸载到队列并让工作人员处理它。

我会根据您的情况添加第 2 步的更正:

一个单独的工作服务器监视队列,并在出现消息指示它执行此操作时启动所有调整大小、处理和复制。

关于c# - 架构: Handling large scale photo upload and resizing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23223246/

相关文章:

C#如何重写这样的?

python - 如何使用 python 将像素映射到新图像中的值?

c# - 将多个多页 tiff 图像合并为单个 tiff C#

azure - Azure 存储帐户中没有“表”选项

c# - 将 Lync 2010 与外部程序集成

c# - Autofac:使用 Web API 2 设置,我缺少什么

algorithm - 快速检测图像中线条倾斜度的算法

azure - NUnit azuredevops 管道

asp.net - 使用适用于 .NET 的 Azure Application Insights Auto Instrumentations 几乎是不可能的吗?