我正在开发一个标准的 ASP.NET MVC 3 Web 应用程序(托管在 IIS 7 上)。该站点允许用户上传照片等。
上传过程如下:
- 用户使用小部件(当前为 plupload)从他们的 PC 中选择文件。
- AJAX 调用发生在我的服务器上,图像在 HTTP POST (Request.Files) 中
- 服务器调整照片大小 N 次
- 每张调整大小的照片都上传到 Amazon S3
目前,上述内容是通过使用 .NET 4.0 的 TPL 的“即发即弃”技术实现的。
我想让上面的内容更加灵活和健壮。例如,如果图像处理失败(它使用的是 GDI,所以很可能),或者 S3 出现故障(这会发生),我或用户将不会知道。
我正在考虑将 WCF 服务托管为 Windows 服务,该服务轮询文件夹中的图像。
我的主网站会简单地将图像通过 FTP 传输到“watched”文件夹,然后该服务会负责图像处理和上传。
不需要“立即”通知用户照片已完成。换句话说,现在我们显示“您的图像正在处理中,很快就会可用”的消息。
总而言之,该服务需要:
- 调整图片大小
- 上传图片到S3
- 读/写数据库
- 能够“重试”失败的图像
有什么建议吗?是 FileSystemWatcher 一个好的选择?
最佳答案
在我当前的项目中,我们实现了一个类似的中间件服务,负责使用 FileSystemWatcher 进行数据处理,并取得了相对成功。一些需要记住的事情:
- 一定要为核心处理实现某种排队。同时启动 100 个图像转换进程不是一个好主意。考虑使用线程池。
- FileSystemWatcher 将在文件创建后立即发出通知,此时它可能仍处于只写锁定状态 - 您将必须执行定期检查以确定开始处理的正确时间。可能使用主循环和队列。
- 跟踪细粒度的状态变化(如 file_created、file_processing、file_processed、file_uploading 等)。您可能真的需要它们进行调试。
希望这对您有所帮助,祝您好运。
关于c# - 图像处理架构设计建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6869582/