【问题标题】:How to run a sub-task only on one Worker Role instance如何仅在一个 Worker Role 实例上运行子任务
【发布时间】:2010-02-04 17:08:36
【问题描述】:

我有两个辅助角色实例。

我只想在其中一个 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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      如果他们需要做不同的事情,那么在我看来,您没有 2 个单一工作者角色的实例。实际上,您有 2 个不同的工人角色。

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

      为 Azure 开发的好处之一是,如果您正确设计应用程序,您将自动获得可扩展性。如果让您额外工作以获得不可扩展的东西,这就是您正在尝试做的事情。

      是什么触发了此任务的启动?如果您在队列存储中使用消息(如 Joannes 所建议的那样),那么只有一个工作人员角色会接收并处理该消息,而您的工作人员角色的哪个实例执行此操作并不重要。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-07
        • 2019-05-16
        • 2018-07-29
        • 1970-01-01
        相关资源
        最近更新 更多