2

我在 Windows Azure 上托管了一个 WCF 服务作为“云服务”。当服务启动时,它需要将数据从文件/磁盘填充到其内存中,以便快速访问(换句话说,缓存)。现在我正在使用 C:\Documents\Filestoprocess 文件夹,以便 WCF 调用该文件夹并在其内存中填充该文件夹中的数据数据。我有 5,000 个小文件。如何在 Azure 中执行此操作?是否有我可以在 WCF 中调用的文件夹路径,以便 WCF 调用这些文件并打开每个文件并将每个数据保存在文件中?我并不是真的在寻找使用带宽通过网络进行复杂的 Blob 访问。我正在寻找从在其自己的公共网址上运行的 WCF“云服务”对这些文件的简单磁盘 I/O 访问。

4

3 回答 3

2

您应该尝试使用云存储服务来存储数据,就像您写入本地文件系统一样,它可能会在服务重新启动或服务回收时被破坏。

您可以考虑使用 azure drive 服务,这就像创建磁盘潜水一样。它位于 blob 存储之上。

但是,如果您真的想在本地文件系统上写入和读取数据,请查看这篇博文http://blog.codingoutloud.com/2011/06/12/azure-faq-can-i-write-to-the- Windows azure 上的文件系统/

它讨论了设置您的服务定义以允许写入本地文件系统。

于 2012-08-24T18:57:07.373 回答
2

根据您的实例的大小,您将获得一个非永久性磁盘,您可以在其中存储此类临时数据。超小型实例的最小值为 20GB。您不应该直接访问磁盘,而是需要使用本地资源,您可以在服务定义文件或 Visual Studio 中进行配置(双击您的 Web / Worker 角色)。

这个存储是非持久的,这意味着如果你删除你的部署,如果你减少实例的数量,如果出现硬件问题,......你会丢失这里保存的所有数据。如果要保留文件,则应改用 blob 存储。但是在您的情况下,您需要将文件作为某种缓存机制,本地资源是完美的。

如果您的目标是缓存数据,您可能需要查看 Windows Azure 中包含的缓存功能:Windows Azure 中的缓存

于 2012-08-24T19:05:22.640 回答
1

Blob 访问并不复杂。实际上,您可以将一个 zip 文件从 blob 存储下载到本地磁盘,解压缩它,然后从这 5,000 个小文件中启动您的 wcf 服务。

查看此 msdn 页面文档DownloadBlobToFile()。关键部分:

CloudBlobClient blobClient = 
        new CloudBlobClient(blobEndpoint, new StorageCredentialsAccountAndKey(accountName, accountKey));

    // Return a reference to the blob.
    CloudBlob blob = blobClient.GetBlobReference("mycontainer/myblob.txt");

    // Download the blob to a local file.
    blob.DownloadToFile("c:\\mylocalblob.txt");

现在:我不同意保存到 C: 上的根文件夹。相反,您应该获取一些本地存储(易于配置)。在角色配置中配置本地存储后,只需询问角色环境,并询问根路径:

var localResource = RoleEnvironment.GetLocalResource("mylocalstorage");
var rootPath = localResource.RootPath;

注意:正如@KingPancake 提到的,您可以使用 Azure 驱动器。但是:请记住,Azure 驱动器只能由一个实例写入。您需要为其他实例制作额外的快照。我认为使用简单的 blob 复制文件(作为单个 zip 文件或单个文件)然后从那里开始会更简单。

您提到了对网络+带宽的担忧。您无需为同一数据中心内的带宽付费。另外:速度非常快:每核 100Mbps。因此,即使使用小型实例,您也可以非常快速地复制文件,当您使用较大的实例时更是如此。

最后一个想法:在不使用 blob 存储或 Azure 驱动器(作为 vhd 安装在 blob 存储中)的情况下,访问 5,000 个文件的唯一其他方法是从外部源下载文件或将它们与 Windows 捆绑Azure 包(然后它们会显示在您的应用程序文件夹中,位于您将它们放入的任何子文件夹下)。捆绑有两个缺点:

  • 由于尺寸增加,上传部署包的时间更长
  • 在不重新部署包的情况下无法更改任何单个文件。

通过存储在 blob 中,您可以轻松更改一个(或全部)小文件,而无需重新部署代码 - 您只需要发出信号以从 blob 存储重新读取或重新启动实例,以便它们自动下载新的文件。

于 2012-08-24T19:04:31.147 回答