我有一个系统,用户可以上传约 16 兆像素的全分辨率图像,这会导致文件很大。
当前的方法是:
- 接收 HTTP 请求中的上传内容。
- 在请求中,将原始文件写入 Blob 存储
- 仍然在请求范围内,以不同的分辨率制作约 10 份文件副本。 (这些是不同尺寸的缩略图,有些适用于 Hi-DPI(视网膜)设备,还有用于全尺寸查看的尺寸。我还将图像转换为 WebP。
- 然后,我将所有结果传输到不同区域的 Blob 存储以用于私有(private) CDN 目的。
显然,问题在于,由于这一切都是在 HTTP 请求中完成的,因此它比任何其他典型的 HTTP 请求消耗更多的服务器资源,特别是当用户开始批量上传图像(一次多个用户)时。如果用户上传大图像,内存消耗会急剧增加(我使用 ImageMagick.NET 进行图像处理)。
这样的架构是否更合适:
- 接收文件上传,写入 blob,向处理队列添加通知,向用户返回成功。
- 单独的工作服务器接收新文件的通知并开始所有调整大小、处理和复制。
- 我只是将客户端 JavaScript 设置为在几秒钟内不加载图像预览,或者在找不到图像时重试(这意味着图像仍在处理中,但可能很快就会显示) )。
至少这种新方法将更容易扩展,并且具有更可预测的性能。但仅仅处理像上传照片这样的“日常”事情似乎需要做很多工作。 有更好的方法吗?
我知道新方法遵循与使用外部调整大小服务相同的原则,但不想在内部执行此操作,因为我担心其中一些第三方服务的隐私。这仍然意味着我必须调整客户端来处理丢失/未处理的图像。
最佳答案
是的,你所描述的是一个更好的方法。这听起来更复杂,但这就是大多数可扩展站点处理大负载的方式。将其卸载到队列并让工作人员处理它。
我会根据您的情况添加第 2 步的更正:
一个单独的工作服务器监视队列,并在出现消息指示它执行此操作时启动所有调整大小、处理和复制。
关于c# - 架构: Handling large scale photo upload and resizing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23223246/