如何仅在一个Worker Role实例上运行子任务

时间:2010-02-04 17:08:36

标签: azure azure-worker-roles

我有两个工人角色的实例。

我想在其中一个Worker Role实例上运行一个子任务(在线程池线程上)。

我最初的想法是做这样的事情:

ThreadPool.QueueUserWorkItem((o) =>
{
    if (RoleEnvironment.CurrentRoleInstance.Id == RoleEnvironment.Roles[RoleEnvironment.CurrentRoleInstance.Role.Name].Instances.First().Id)
    {
        emailWorker.Start();
    }
});

但是,上面的代码依赖于Role.Instances集合,始终以相同的顺序返回实例。是这样的吗?或者可以按任何顺序退回物品吗?

是否还有另一种批准的方法只在一个角色实例上运行任务?

2 个答案:

答案 0 :(得分:1)

Joe,您正在寻找的解决方案通常依赖于:

  • 使用Blob存储作为角色实例之间的同步点,在特定blob上获取租约(类似于锁定但具有过期时间)。
  • 或从队列存储中排队/出列消息,这通常是建议的模式,以延迟长时间运行的操作,如发送电子邮件。

无论哪种方式,您都需要通过Azure存储才能使其正常运行。我建议看一下Lokad.Cloud,因为我们已经设计了这个开源框架来精确处理这种情况。

答案 1 :(得分:0)

如果他们需要做不同的事情,那么听起来就像你没有单个工人角色的2个实例。实际上,您有两种不同的工作角色。

特别是在查看应用程序的可伸缩性时,进程需要能够在多个实例上运行。当您只想在一个角色上运行的任务变得足够大以至于需要扩展到两个或更多角色实例时会发生什么?

开发Azure的一个好处是,如果您正确设计应用程序,则会自动获得可伸缩性。如果让你额外工作以获得不可扩展的东西,那就是你想要做的事情。

什么触发此任务启动?如果您在队列存储上使用消息(如Joannes所建议的那样),那么只有一个辅助角色会接收消息并对其进行处理,而且您的辅助角色的哪个实例会这样做无关紧要。

所以现在,如果您有一个正在执行子任务的辅助角色和另一个正在执行其他任务的辅助角色,则只需向Azure解决方案添加两个辅助角色。但是,即使您这样做,处理子任务的辅助角色也应该以这样的方式编写:如果您将其扩展为运行多个实例,它将正常运行。在这种情况下,您可以坚持使用单个工作者角色和代码来处理队列中的消息以启动子任务。