我有一个可以接收用户上传的文件的网络应用程序。这些文件存储在 Web 服务器的目录中。其他用户可以下载这些文件。我正在自定义此应用程序以在 Windows Azure 上迁移。在 Windows Azure 上,这些文件存储在 sitesroot 和 approot 中。Windows Azure 是自动同步这些更改还是我应该手动同步它们?也许,用这种方法存储文件不合适?
2 回答
实际上,Azure 不会在实例之间同步目录。您希望将文件存储在集中式存储中。Azure Blob 存储是迄今为止最好的选择。访问存储的API比较简单
@Igorek 的好回答。只是想补充一点。您的每个角色实例都完全独立运行。而且,从本质上讲,角色实例是 Windows 2008 Server。如果您有 5 个 Web 角色实例,则有 5 个虚拟机正在运行,每个虚拟机都有自己的本地存储。
而且,虽然您可以使用本地存储,但它是每个 VM 实例的单独存储,并且它是非持久的(这意味着如果磁盘崩溃,您的数据就会消失)。
正如@Igorek 所建议的那样,Blob 存储独立于您的角色实例。您可以从任何地方(从任何角色实例,甚至从本地应用程序)访问它。而且blob存储是按容器组织的,每个blob最大可以达到200GB。但最重要的是:它是持久的:在数据中心内进行三重复制,并在地理上复制到相邻的数据中心。
只要您的存储帐户与您的应用程序位于同一数据中心,访问速度就会非常快(每个 blob 大约 60MB/秒)。此外,您可以将单个 blob(或容器)设置为public或private。公共 blob 非常适合 CSS、图像或您可能希望在网页上呈现的任何其他内容。它们可以通过 URI 访问,例如:
https://myapp.blob.core.windows.net/images/logo.png
使用这种类型的 URI,您可以将其嵌入网页中,浏览器现在将直接从存储中检索这些图像,完全绕过您的 IIS Web 服务器,从而减轻您的角色实例的负载。从您的服务器上减轻足够的负载,您最终可以减少您的实例数。
现在,有了私有blob,外部世界就看不到这些了;您需要您的存储帐户密钥才能访问这些。对于您的 Web 服务器,这一切都是透明的。您可以快速将数据加载到 Blob、将 Blob 下载到本地存储、向最终用户提供内容……就像从本地磁盘提供内容一样。如果您需要对必须位于磁盘上的文件执行操作,您可以先将其下载到本地存储,然后从本地存储执行操作。
关于私有 blob 的另一件事:您可以通过在查询字符串上使用共享访问签名对 url 进行编码来授予对它们的临时访问权限。这是使用您的存储帐户密钥签署的,并授予长达一小时的访问权限。例如,如果您的最终用户拥有其他人不应访问的特定于帐户的 pdf,则您可以选择提供此内容。任何一个:
- 将私有 blob 从 blob 存储下载到本地存储,然后通过 IIS(或任何备用 Web 服务器)将其发送回浏览器,或者
- 返回到私有 blob 的链接,使用共享访问签名进行编码(具有一些短 TTL 到期时间,可能是 5 分钟),并让最终用户从他们的浏览器访问 blob(例如,通过链接单击),然后绕过您的角色实例,直接从 blob 存储下载 blob。