6

我正在构建一个网站,该网站(除其他外)允许用户通过 web api 上传照片。用户图像将存储在 azure storage blob 中以显示在用户相册中,并与社交媒体共享。该站点将作为一个 azure 网站托管。我渴望将数据传输成本降至最低。我了解 azure 网站和表/blob 存储之间的数据传输不会产生数据传输费用(因为它不被视为“出站”),而从 azure 网站外部请求的数据会产生数据传输费用。作为对此的回应,我有两种将图像暴露给浏览器的策略:

1.) 通过 URI 到 azure 存储中的图像 blob,例如使用本地存储帐户http://ipv4.fiddler:10000/devstoreaccount1/bcb2ad7581.jpg

2.) 通过 web api 从存储中下载图像字节并返回它们。例如使用本地主机http://localhost:58559/api/image/bcb2ad7581.jpg

这些是我的假设。直接存储访问(上面的方法 1)更有效。通过 web api(上面的方法 2)访问图像必须产生直接访问不会产生的开销,对吗?每个 web api 请求必须消耗一个 asp .net 线程加上 cpu 周期。对于每个处理的 web api 图像请求,对站点上其他无法且必须排队的 web api 资源的请求少了一个。另一方面,与图像共享的任何外部站点都会为每个图像请求增加数据传输成本(以及其他成本);如果通过方法 1 访问。

因此,我的策略是通过指向存储的直接链接(方法 1)访问站点内的图像,例如,当用户打开相册时,所有标签的 src 属性中都有 azure blob uri。但是,当用户单击 Facebook 图标进行分享时,我将通过 web api 提供指向图像的链接(方法 2)。我意识到用户可以使用“PinIt”按钮等插件绕过所有这些,但这没关系。

我只是在学习这些东西,所以我可能会走得很远。关于未将出站传输成本应用于 azure 网站,我错了吗?我不认为我是,但至少可以说,整个定价模式令人困惑。

正在从具有标记和 src 属性的浏览器 html 页面访问 blob 存储,被视为出站数据传输;即使 html 页面来自 azure 网站域?我的意思是它只有在服务器端代码访问存储时才免费,而不是 html 客户端?

是否通过方法 2 节省了任何数据传输成本(如果确实有的话),只是被与 web api 方法相关的不同成本(如带宽成本)所抵消?

我对直接访问 blob 存储的性能优势是错误的,还是对 web api 请求的开销可能是错误的?

这是设计的早期阶段,所以我可以在必要时抛弃 Azure。我宁愿不这样做,因为我认为这就是我正在寻找的东西。我不想要什么东西,我很乐意为我使用的服务付费。当然,我不想让我的无知付出代价。

在这方面,我可以接受您的建议,并非常感谢您的帮助。

4

1 回答 1

12

要回答您的问题:

关于未将出站传输成本应用于 azure 网站,我错了吗?

遗憾的是,是的 :) 任何从 Azure 数据中心 (DC) 流出的数据都会产生出站传输成本,其中包括通过您的网站提供的数据。

正在从具有标记和 src 属性的浏览器 html 页面访问 blob 存储,被视为出站数据传输;即使 html 页面来自 azure 网站域?我的意思是它只有在服务器端代码访问存储时才免费,而不是 html 客户端?

是的。请记住,浏览器正在使用位于 Azure DC 之外的数据。

是否通过方法 2 节省了任何数据传输成本(如果确实有的话),只是被与 web api 方法相关的不同成本(如带宽成本)抵消了吗?

不会。因为数据最终会流出 Azure DC(无论是直接通过存储还是通过 Web api)。

我对直接访问 blob 存储的性能优势是错误的,还是对 web api 请求的开销可能是错误的?

与通过 web api 传输数据相比,提供对 blob 存储的直接访问肯定会获得更多的性能优势。另外,您还会增加延迟。

解决方案推荐

对于您的应用程序,我建议您查看Shared Access SignatureAzure Blob 存储提供的功能。我相信这将显着提高您的应用程序的性能。

对于上传,您可以创建一个 SAS URL 将上传权限并让您的 Web 应用程序直接在 Blob 存储中上传文件。这样上传数据就不会通过您的服务器进行路由。我写了一些你可能会觉得有用的博客文章:

http://gauravmantri.com/2013/02/16/uploading-large-files-in-windows-azure-blob-storage-using-shared-access-signature-html-and-javascript/

http://gauravmantri.com/2013/12/01/windows-azure-storage-and-cors-lets-have-some-fun/

对于下载图像,再次让您的 Web API 返回一个 SAS URL,而不是从 Blob 存储读取图像数据,然后将该数据流式传输回客户端浏览器。

于 2015-01-22T14:35:32.430 回答