2

我同时设置了 ASP.NET 应用程序和 Worker Role,现在我想知道如何在它们之间进行通信?我认为这个想法是解决方案将分布在不同的地理位置。那么如何以简单高效的方式链接分布式 Worker 和 Web Roles 呢?我已经开始研究 WCF,但在我看来它是一种矫枉过正和过于复杂的事情。我的另一个想法是在 Worker 角色中使用 SignalR 客户端与 Web 角色中的服务器通信。

编辑:

确切的上下文:

1)用户上传文件到服务器

2)服务器将文件发送到Azure Storage,并将文件名添加到CloudQueue

3)Worker从CloudQueue中获取文件名

4)Worker 启动一个新线程,从 Azure Storage 获取文件并开始处理它

5)Worker/Thread在文件处理的每一步都向应用程序报告

6)应用程序接收报告并使用SignalR将处理步骤实时转发到客户端的浏览器。

我缺少的是步骤 2 > 3,如何立即通知工人有新文件到达?我不想轮询 CloudQueue,因为它会造成延迟。同样在步骤 5 > 6 中,Worker 需要通知应用程序有关这些步骤的信息,这应该不会延迟,但我再次看不到在这种情况下如何使用轮询解决方案。

4

3 回答 3

1

如上所述,需要更多的上下文。您基本上有两个主要选项,Windows Azure 队列和 Windows Azure 服务总线队列/主题。如果 Web 和 Worker 角色位于同一区域,我个人的建议是使用 Azure 队列,如果不是,则使用服务总线队列。我不得不问你为什么不将你的 Web 角色和 Worker 角色并置在一起,如果你有你的应用程序的地理部署,那么看看在每个区域(例如美国、欧洲和亚洲)部署你的所有 Web 角色和工作角色,然后使用流量经理将用户路由到最佳区域。

关于何时使用哪个队列“Windows Azure 队列和 Windows Azure 服务总线队列 - 比较和对比”有一篇很好的博客文章:http: //msdn.microsoft.com/en-us/library/windowsazure/hh767287.aspx

高温高压

编辑

下面是一种用于 Web 和 Worker Role 通信的好方法(我从@smarx 回答的最近的一个线程中偷了这个)

1 Web 角色将包含作业 ID 的消息写入队列。

2 Worker 角色完成工作并将结果写入具有分区键的表。

3 Web 角色正在轮询表的该行。一旦它存在,答案就会回来。

在您的情况下,您可以让 Worker 角色使用状态更新更新表存储,然后让您的 Web 角色选择它们并将它们显示给用户。例如 20%、50%、完整等...

只要您从 Web 角色充分轮询(*注意交易成本),我并没有真正看到此类通信的延迟

我认为可以在此处进行某种角色间通信以进行状态更新,但 IMO 可能有点矫枉过正:

http://msdn.microsoft.com/en-us/library/windowsazure/hh180158.aspx

于 2012-08-21T22:48:43.620 回答
0

我使用 azure 表存储作为工作角色和 Web 角色之间进行通信的地方。基本上,Worker 角色会将消息/通知存储到 azure 表中,而 Web 角色将有一个计时器来定期检查 azure 表中的更改。之后,该 Web 角色将使用 SignalR 向客户端页面实时发送消息以报告进度。

Global.asax.cs 文件:

private static System.Timers.Timer _timer;

protected void Application_Start()
{
     //Start the timer job
     _timer = new System.Timers.Timer(3000);
     _timer.Elapsed += new ElapsedEventHandler(WebRoleTimerJob);
     _timer.Start();
}


/// <summary>
/// This event will be fired intervally every 3 seconds to broadcast messsage to all registered client pages using SignalR
/// </summary>        
public static void WebRoleTimerJob(object sender, ElapsedEventArgs e)
{               
      // Here, you can read Azure table storage to detect any changes    
      // or notification from Worker role
      // ....

      //If there is any changes, then broadcast message 
      // to all relevant client pages using SignalR   

      var context = GlobalHost.ConnectionManager.GetHubContext<Hub>();       
      context.Clients.All.addNewMessageToPage("your_message_name", "message_content");
}
于 2015-04-01T15:23:11.443 回答
0

我建议看一下 CQRS,它代表命令查询责任分离。

该架构的目的是创建松散耦合、可扩展和可扩展的系统。

http://cqrsjourney.github.com/

Greg Young 发明了这个系统,并且有许多开源实现可用于加快分布式、可扩展系统的构建。在他之前是奠定基础的伯特兰·迈耶(Bertrand Meyer)。

过于简单的概念是一系列队列将 Web 角色和工作角色分开。因此,当用户从 Web 角色提交工作时,该工作会排队,然后由工作角色接手。权衡是最终的数据一致性,而不是立即的一致性。好处是它是松散耦合和可扩展的。如果队列开始变得太大,可以添加额外的工作角色来处理额外的规模。

该方法使用命令、查询、域对象等概念。CQRS 正在成为一种非常强大的方式来实现我认为您正在寻求的目标。

搜索引擎可以为您提供许多好的资源。以下是一些有用的视频: Greg Young http://www.youtube.com/watch?v=KXqrBySgX-s 我的朋友 Rinat http://www.youtube.com/watch?v=CnvO_nlvrps

祝你好运!

于 2012-08-22T03:25:24.003 回答