针对Azure/CDN进行编程

Sco*_*ott 2 c# cdn azure

我们正在将内部部署应用程序迁移到Azure云.内部企业用户通常通过管理界面将完整尺寸的图像上传到我们的网站(现在这些图像将被发送到Azure blob存储).该网站负责在请求时创建正确的图像大小.那么现在发生的事情(内部环境)是这样的:

1)用户上传完整大小的文件.

2)当通过GetImage HTTP处理程序请求较小的版本(即http://www.site.com/GetImage.aspx?imageid=15&height=100&width=100)时,处理程序会检查我们之前是否已创建该版本的版本那个尺寸的图像.如果是,则将其直接写入Response流.如果没有,则需要一秒钟来调整它,将其保存到"/ iamges/cache"目录并将调整后的图像写入Response流.

3)下次以该大小请求该文件时,它返回先前创建的图像.

所以我想使用Azure和Blob存储实现相同类型的机制,但我有几个问题:

1)我不能简单地检查blob是否存在.我必须首先下载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存储的交互,有什么接近"最佳实践"吗?还有其他方法可以考虑吗?这似乎是图像大小调整的大量开销,所以我想我必须遗漏一些东西或忽略另一种解决方案.

kni*_*hor 6

好的,我觉得这里有很多事情要做.我的回答是基于这些假设:

  • 这些图像的最终用途是在网站上显示
  • 上面提到的网站在Azure上运行
  • 您想使用CDN加速对图像的访问
  • 您正在使用.Net存储客户端库

如果这些假设中的任何一个是错误的,请告诉我,我会适当地编辑我的答案.

  1. 你没错,.Net客户端库中没有内置方法,可以检查blob是否存在.但是,通过执行.FetchAttributes()此操作实际上并不下载图像,它只是尝试检索标头信息(就像列出容器中的所有blob时一样),直到您调用其中一个blob时才实际下载blob..DownloadX()方法.

  2. 您的服务器端代码无需通话即可使用任何CDN功能.它应该只是在blob存储中与你的图像交谈,就像它们是任何旧的blob一样.您需要使用CDN URL的唯一时间是指定要显示的页面上图像的路径.

  3. 您不希望您的网站必须返回图像流,您希望它指向包含图像的CDN上的URL.CDN将能够处理比您可以构建的任何网站更多的负载.然后,网站可以检查blob是否存在,如果存在,只需返回URL.如果没有下载完整图像,请调整大小,保存,然后返回URL.虽然从blob存储中访问图像并不像从本地磁盘读取图像那么快,但它仍然非常快,特别是对于像你所说的那样<10MB的文件.

  4. 大概在某个地方某人指定在您的网站中使用的图像的大小和大小.你可以捕获它然后生成调整大小的图像吗?