文件绑定应用程序中的架构设计和与Azure的角色通信

文件绑定应用程序中的架构设计和与Azure的角色通信,azure,azure-storage,azure-storage-blobs,azure-worker-roles,Azure,Azure Storage,Azure Storage Blobs,Azure Worker Roles,出于可伸缩性的目的,我正在考虑将我的web应用程序移动到Windows Azure,但我想知道如何最好地对我的应用程序进行分区 我希望我的场景是典型的,如下所示:我的应用程序允许用户上传原始数据,然后对其进行处理并生成报告。然后,用户可以查看其原始数据并查看其报告 到目前为止,我认为是一个网络角色和一个工人角色。但是,我知道VHD可以装载到具有读/写访问权限的单个实例,因此我的web角色和工作角色实际上都需要访问公共文件存储。因此,我可能需要一个web角色和两个单独的工作者角色,一个工作者角色用

出于可伸缩性的目的,我正在考虑将我的web应用程序移动到Windows Azure,但我想知道如何最好地对我的应用程序进行分区

我希望我的场景是典型的,如下所示:我的应用程序允许用户上传原始数据,然后对其进行处理并生成报告。然后,用户可以查看其原始数据并查看其报告

到目前为止,我认为是一个网络角色和一个工人角色。但是,我知道VHD可以装载到具有读/写访问权限的单个实例,因此我的web角色和工作角色实际上都需要访问公共文件存储。因此,我可能需要一个web角色和两个单独的工作者角色,一个工作者角色用于处理,另一个用于读取和写入文件存储。这是一个好方法吗


我很难描绘角色之间的管道,并且担心此分区之间的通信所造成的开销,因此欢迎在此输入任何信息。

Blob存储是存储文件的最容易的地方,许多角色和角色实例都可以访问这些文件,而它们都不需要特殊访问

建议的正常模式似乎是:

  • 允许使用web角色的实例上载原始文件
  • 这些web角色实例在不进行处理的情况下返回HTTP调用—它们将原始文件存储在blob存储中,并向队列中添加“DoThisWork消息”
  • 工作者角色实例从队列中提取消息,读取原始blob,执行工作,存储报告结果,然后从队列中删除消息
  • 然后,当用户请求报告时,所有web角色都可以访问该报告
这就是“建议的正常模式”,你可以看到它在第一个Azure PDC中的照片上传/缩略图生成应用程序中得到了实现——它也在这个页面中使用——一直到第二个页面


当然,在实践中,您可能需要根据正在处理的数据的大小和类型来构建此模式。

补充Stuart的优秀答案:Blob可以存储任何大小高达200GB的数据。如果您需要/想要持久化整个目录结构,那么只需几行代码就可以挂载VHD。它是一个NTFS卷,您的应用程序可以与之交互,就像其他任何驱动器一样

在您的情况下,vhd并不适合,因为您的web应用程序必须装载vhd并成为它的唯一编写器。如果您有多个web角色实例(如果您想要SLA并想要扩展,您会这样做),那么您只能有一个编写器。在这种情况下,单个水滴更适合

正如斯图尔特所说,这是一种非常正常和常见的模式。同样,只需几行代码,就可以调用storage sdk将文件从blob存储复制到实例的本地磁盘。然后,您可以使用常规文件IO操作来处理该文件。当您的报告完成后,通过另外几行代码,您可以将报告复制到一个新的blob中(很可能是在web角色知道要查看的一个众所周知的容器中)


您可以更进一步,将行插入到按客户划分的Azure表中,行键标识单个上载的文件,第三个字段表示已完成报告的URI。这使得web应用程序显示客户已完成的报告变得微不足道。

在我们根据彼此的评论进行构建的同时,我还要说,虽然Blob存储非常优秀,队列存储也很好,但无论您是想使用表存储还是想改用SQL Server,都值得仔细考虑。到目前为止,在我构建的所有东西中,SQL Server都被证明是非常有用和有用的—如果您需要执行报表之类的操作,那么表存储仍然很难使用。这都是“在我看来”-我想我仍然部分陷入了一种关系心态!在本例中,使用表vs SQLAzure是个人的选择,但它似乎是一个非常简单的查找方法(当您只需要一个字段来索引时,它非常适合表存储)。表存储运行$0.15/GB,而SQLAzure运行$10.00/GB。使用表存储,您将根据存储使用情况进行计量。使用SQLAzure,您的最低成本是10美元,即使您存储了1KB。但是,如果您需要跨大型表使用多个索引,SQL Azure是一个不错的选择,性能方面。是的-对不起-可能是困惑多于帮助。。。正如我试图说的“这值得仔细考虑”——正如你所说的,其中也涉及“个人选择”: