最小化 Azure 存储出站数据成本的策略

Strategy to minimize Azure storage outbound data costs

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

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

2.) 通过网络 api 从存储中下载图像字节并 returns 它们。例如与本地主机 http://localhost:58559/api/image/bcb2ad7581.jpg

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

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

我只是在学习这些东西,所以我可能会走得很远。 出境转账费用未应用于天蓝色网站,我错了吗?我不认为我是,但至少可以说整个定价模型令人困惑。

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

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

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

这是设计的早期阶段,所以如果有必要,我可以放弃 Azure。不过,我宁愿不这样做,因为我认为这就是我正在寻找的。我不想白白得到任何东西,并且很乐意为我使用的服务付费。当然,我不想让我的无知让我付出代价。

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

回答您的问题:

Am I wrong about outbound transfer costs not being applied to azure web sites?

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

Is accessing blob storage from a browser html page with tag and src atribute, considered outbound data transfer; even if the html page comes from an azure website domain? I mean is it only free when the server side code accesses the storage, not the html client?

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

Is any data transfer cost saved via method 2 (if indeed there is one), simply cancelled out by a different cost associated with the web api method (like bandwidth cost)?

没有。因为数据最终会流出 Azure DC(不管是直接通过存储还是通过网络 api)。

Am I wrong about the performance benefit of direct access to the blob storage, or possibly wrong about the overhead of the web api requests?

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

解决方案推荐

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

对于上传,您可以创建一个 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 return SAS URL 而不是从 blob 存储读取图像数据,然后将该数据流式传输回客户端浏览器。