-1

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

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

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

然而,这个过程需要升级,以便它运行一个可执行的繁重工作。

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

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

a) 在云服务中的 Azure Web 角色和辅助角色之间,我可以期待什么样的数据传输速度?

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

c) 工人角色和网络角色能否/是否真的在同一台机器上运行?

d) 我可以从网络应用程序内部运行 .exe 吗?如何获得路径?

4

1 回答 1

1

我会建议一个类似于以下的工作流程:

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

使用与此类似的架构,您可以通过为您的工作角色使用更大的机器来垂直扩展,或者通过添加更多工作角色的实例来水平扩展。

为了使该过程更具弹性,您可能希望在客户端通知 Web 服务上传数据后立即返回客户端,然后可以在处理数据后使用 Signalr 直接从工作角色向客户端发出信号.

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

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

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

c) 您可以在 Web Role 上运行 Worker Role 样式处理,从 WebRole.OnRoleStart 和 WebRole.Run 调用您的 Worker Role 样式代码,然后根据您需要扩展此代码可以移动到它自己的专用 Worker Role

于 2013-07-08T22:37:12.273 回答