【问题标题】:Azure WCF accessing disk filesAzure WCF 访问磁盘文件
【发布时间】:2012-08-24 18:34:04
【问题描述】:

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

【问题讨论】:

    标签: azure azure-storage azure-blob-storage


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      取决于on the size of your instances,您将获得一个非持久性磁盘,您可以在其中存储此类临时数据。超小型实例的最小值为 20GB。您不应该直接访问磁盘,但您需要使用 local resource 来代替,您可以在 your service definition 文件或 Visual Studio 中进行配置(双击您的 Web / Worker 角色)。

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

      如果您的目标是缓存数据,您可能想看看 Windows Azure 中包含的缓存功能:Caching in Windows Azure

      【讨论】:

        【解决方案3】:

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

        查看this msdn page 记录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 驱动器(在 blob 存储中作为 vhd 挂载)访问 5,000 个文件的唯一其他方法是从外部源下载文件或捆绑它们使用您的 Windows Azure 包(然后它们会显示在您的应用程序的文件夹中,在您将它们放入的任何子文件夹下)。捆绑有两个缺点:

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

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

        【讨论】:

          猜你喜欢
          • 2017-07-26
          • 1970-01-01
          • 1970-01-01
          • 2021-03-29
          • 2010-10-20
          • 2011-05-23
          • 2020-03-31
          • 2014-11-13
          • 2011-08-04
          相关资源
          最近更新 更多