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

问题描述 投票:1回答:2

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

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

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

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

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

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

azure azure-worker-roles
2个回答
1
投票

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

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

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


0
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.