2011-01-10 76 views
2

我们正在将内部部署应用程序迁移到Azure云。内部公司用户经常通过管理界面将全尺寸图像上传到我们的网站(现在将这些图像发送到Azure blob存储)。该网站负责在请求时创建正确的图像大小。所以,现在是什么情况的权利(对环境的前提下)是这样的:针对Azure/CDN编程

1)用户上传全尺寸的文件。

2)当通过GetImage HTTP处理程序(即http://www.site.com/GetImage.aspx?imageid=15&height=100&width=100)请求较小的版本时,处理程序将检查是否先前已创建该大小的该图像的版本。如果是这样,它将直接写入响应流。如果不是,则需要一秒来调整其大小,将其保存到“/ iamges/cache”目录并将调整大小的图像写入响应流。

3)该文件被请求在该大小它返回先前创建的图像下的时间。

所以,我要实现相同的类型使用Azure和Blob存储机制,但我有一对夫妇的忧虑:

1),我不能简单地检查,看看是否存在斑点。我必须先下载blob,然后调用FetchAttributes来查看它是否引发异常。但是,这样做实际上会下载图像。所以,这不是图像请求的数量的两倍(一个用于查看是否存在,另一个用于显示给用户)?

2)假设图像不在大小,我需要它存在(即BLOB /images/cache/image_15_100_100.jpg不存在 - 编号15,100×100像素)。所以我曾经向CDN发出过请求,看看它是否存在。现在我必须下载一个5-10 MB的完整大小的映像(而不是从我们的内部文件系统快速读取它),在内存中加载该5-10 MB映像,调整大小并重新上传到CDN。这似乎很耗时间,特别是当我可以在一个请求中有10-15个这样的图像时。

我知道Azure是比较新的,但有任何接近“最佳实践”为这种类型的互动与Blob存储?我可以考虑另一种方法吗?这似乎是图像大小调整的很多开销,所以我想我必须缺少某些东西或忽略其他解决方案。

+0

是预定的可能的图像尺寸请求或者是他们完全任意? – Omar 2011-01-10 15:27:34

回答

6

OK,我觉得有很多事情在这里。我的答案是基于以下假设:

  • 这些图片的最终用途是 显示的网站
  • 上面提到的网站是 在Azure上
  • 运行时,您要使用CDN来加快 访问这些图象
  • 您正在使用的.Net存储客户端 库

如果这些假设是错误的,让我知道,我会适当地编辑我的答案。

  1. 你说得对,在.Net客户端库中没有内置的方法,它允许你检查一个blob是否存在。但是,通过执行.FetchAttributes()这实际上不下载图像,它只是试图retrieve the header information(当你列出所有在一个容器中的斑点很像),该斑点实际上并没有下载到您拨打的.DownloadX()方法之一。

  2. 你的服务器端代码有没有必要谈使用任何的CDN功能。它应该只是与你的图像在blob存储中谈话,就像他们是任何旧的blob。您唯一需要使用CDN网址的时间是指定显示页面上图像的路径。

  3. 你不想你的网站有返回图像流,你想让它指向包含在图像上的CDN的URL。 CDN将能够处理比您可以构建的任何网站更多的负载。然后网站可以检查blob是否存在,如果存在,只需返回URL。如果它没有下载完整的图像,请调整它的大小,保存它,然后返回URL。虽然从Blob存储访问图像并不像阅读它关闭本地磁盘的一样快,它仍然是相当快,特别是对文件< 10MB就像你在说什么。

  4. 大概某处有人指定地方,什么尺寸的图像在您的网站上使用。你能捕捉到它并生成调整大小的图像吗?