用于快速处理和存储大型数据块的最佳架构

时间:2013-07-08 22:05:47

标签: azure

我的情况涉及一个MVC应用程序,可能会上传大量高达32MB的数据块。上传每个块后,需要处理它并在客户端浏览器上传下一个块之前发送响应。

最终,数据及其处理结果需要存储在Azure存储上。数据处理是CPU密集型的。鉴于传输此数据量需要相当长的时间,我希望减少数据在计算机之间执行的次数,以及将工作移出Web服务器线程。

目前,这是通过排队单个工作线程消耗的作业来完成的。

但是,需要升级此过程,以便它为繁重的工作运行可执行文件。

在处理结束时,数据将上载​​到Azure Blob存储。因此,在发送响应之前,数据已经需要通过网络(AFAIK)传输两次。不理想。

我知道Azure中的不同排队选项,但我担心情况会变得更糟而不是更好。我不想过度解决这个问题,但确实需要尽可能快速有效地运行整个过程。

a)我可以在Cloud Service中的Azure Web角色和辅助角色之间获得什么样的数据传输速度?

b)有没有办法将数据直接传输到Azure存储,然后在那里进行处理,而无需再次传输?

c)工作者角色和网络角色能否实际在同一台机器上运行?

d)我可以从网络应用程序中运行.exe吗?如何获得这条路?

1 个答案:

答案 0 :(得分:1)

我建议的工作流程类似于:

  • 客户端将数据直接上传到Blob存储(按this guide更小的块)
  • 上传完成后,客户端会通知您的Web服务,并且Web服务会在服务总线队列(jobQueue)上发布消息。该消息包含唯一的会话标识符和上载的数据的Blob Url。然后,Web服务阻止并侦听具有指定sessionId的回复消息的另一个服务总线队列(replyQueue)。
  • 多线程Worker角色长轮​​询服务总线jobQueue,对于它接收到的每条消息,处理它们,然后将处理后的数据存储在某处,然后创建回复消息并将其发送到设置了sessionId的replyQueue。
  • 然后,Web服务将收到回复消息(对于给定的sessionId),并可以将结果返回给您的客户。

使用类似于此的体系结构,您可以通过为工作者角色使用更大的计算机来垂直扩展,或者通过添加更多的辅助角色实例来横向扩展。

为了使流程更具弹性,您可能希望在客户端向Web服务通知上载数据后立即返回客户端,然后可以在数据时使用Signalr直接从工作者角色发送客户端信号已被处理。

我对你问题其他部分的回答是:

a)我不确定角色之间数据传输速度的保证是什么

b)是的,您可以将数据直接传输到Blob存储,然后从Blob传输到工作者角色

c)您可以在Web角色上运行工作者角色样式处理,从WebRole.OnRoleStart和WebRole.Run调用您的工作者角色样式代码,然后在需要扩展时,可以将此代码移动到其自己的专用工作者角色