我正在开发一个图片托管网站,而且我有点腌菜。我选择了亚马逊S3,因为它速度快,它可以扩展,并且可以随时随地付费。
当我从我的网站上传图片时,我需要在服务器上处理它们 - 创建3种不同的尺寸,将数据插入数据库,然后我就可以上传到S3(图像的所有3种尺寸) )。
我目前正在使用plupload进行上传,我现在将其设置为我的数据库作为图像的存储 - 仅用于测试目的。但我刚刚意识到 - 这个上传到我的网络服务器,处理然后上传到S3会意味着每张图片上传时间加倍吗?
有没有聪明的方法来处理这种情况?
答案 0 :(得分:2)
我们正在做与S3中的文件和存储处理类似的事情。主要区别在于我们的网络服务器和处理服务器都在EC2上,因此它们不会产生任何往返S3的传输成本,并且它们具有非常高的S3带宽。是否可以在EC2实例上运行图像大小调整过程?你可以:
直接接受上传到EC2实例上的服务器进程,立即处理它们,然后将图像保存到S3,或者......
将图像直接上传到S3,以某种方式告知您的EC2进程图像到达(可能是SQS队列),然后让服务器进程通过从S3获取文件,处理图像和保存来响应信号已调整大小的图像返回S3。
基本上,我说你应该利用这个(来自AWS网站上的S3描述):
没有数据传输费用 Amazon EC2之间传输的数据 和同一地区内的Amazon S3 或者用于在。之间传输的数据 亚马逊EC2北弗吉尼亚州 和亚马逊S3美国标准区域。
答案 1 :(得分:1)
当然,您需要更多时间保存图片,因为您实际上有两次HTTP传输。您可以尝试与其他操作并行执行上载,例如:
我怀疑上传原始/最大图像需要的不仅仅是生成两个较小的图像,因此并行解决方案可以很好地工作。即使上传不会产生其他两个图像,上传也不会占用大量CPU时间,因此在所有情况下都应该看到改进。
当然它更复杂,特别是如果你考虑错误处理。
答案 2 :(得分:1)
再次查看您的问题,您似乎关注“每张图片的上传时间” - 您指的是等待您的网络应用的最终用户吗?您不必等到图像调整大小并上传到S3才能向上传用户返回响应。用户上传完成后,您应该排队作业并立即向用户返回响应。然后有一个单独的后台线程,它将作业从队列中取出并在后台进行图像处理。作业完成后,将其上传到S3并更新数据库以反映已调整大小的图像。