【问题标题】:Azure Worker Role Scheduled TasksAzure 辅助角色计划任务
【发布时间】:2013-12-30 15:50:00
【问题描述】:

我已经创建了一个计划任务系统。我正在使用具有半个核心的 Windows Azure 辅助角色。我从 SQL Azure 数据库中提取任务,我将其排队和出列。 任务可以相互独立运行。我估计每个工作角色可以在一个小时内执行三十个任务。随着我的解决方案的增长,我担心我必须为每 30 个新客户添加一个新的工人角色。如果我有超过一千个客户,我将拥有大约 35 个工人角色项目。

  • 工人角色是否是我的业务需求的错误解决方案?

  • 每个辅助角色项目的代码都是相同的。有没有一种方法可以在不添加其他项目的情况下执行以下代码以获得更多工作者角色?

  • 我尝试了并行任务库,但是我的代码无法正常工作。在极少数情况下,客户的订单最终会出现在错误的帐户中;用户名和密码被越过。即使是并行任务,任务的数量还是会有限制?

这是我的代码:

public class WorkerRole : RoleEntryPoint
{
    string conString = ConfigurationManager.ConnectionStrings["XXX"].ConnectionString;
    IJMATaskProvider m_TaskProvider;

    public override void Run()
    {
        // This is a sample worker implementation. Replace with your logic.
        //Trace.TraceInformation("CloudCartConnector.TaskRole entry point called", "Information");
        while (true)
        {
            Thread.Sleep(30010);
            ExecuteTasks();
            Thread.Sleep(500010);
            Trace.TraceInformation("Working", "Information");
        }
    }

    public override bool OnStart()
    {
        ServicePointManager.DefaultConnectionLimit = 12;
        m_TaskProvider = JMATaskFactory.Get(conString, CloudCartConnectorLogProvider.Instance);
        return base.OnStart();
    }


    void PerformTask(JMATask task)
    {

        //Update database
    }


    public string ExecuteTasks()
    {
        try
        {
            List<JMATask> tasks = m_TaskProvider.GetAllTasks();

            foreach (JMATask task in tasks)
            {
                PerformTask(task);
            }

            return "OK";
        }
        catch (Exception ex)
        {


        }
    }
}

【问题讨论】:

    标签: c# multithreading azure


    【解决方案1】:

    工人角色是否适合我的业务需求?

    绝对不是。 Worker 角色仅用于此目的 - 处理后台任务。

    每个工人角色项目的代码都是相同的。有没有办法我 可以执行下面的代码以获得更多的工人角色而无需添加 另一个项目?

    正如@Jakub 提到的,您可以让许多相同工作角色的实例运行处理任务。这里的关键是一项任务仅由一个工作角色实例处理。

    您可以做的一件事是实现某种主/从实现,其中一个工作角色实例将从数据库中获取任务,将它们推入队列(主),然后所有其他工作角色实例(从)将获取来自队列和处理任务的数据。我前段时间写了一篇博文,描述了这种方法,您可能会发现它很有用:http://gauravmantri.com/2013/01/23/building-a-simple-task-scheduler-in-windows-azure/

    【讨论】:

    • 您好,您的网站已关闭,我无法访问您的页面。请问可以修吗?
    【解决方案2】:

    我会使用消息队列来对工作进行排队(消息可以只指向数据库中的一条记录)——你可以使用自动缩放,不需要自己轮询数据库 工作同步没有问题分配(确保 2 个工作角色不会从数据库中选择相同的任务)。

    【讨论】:

    • 感谢您的建议。我看到消息队列可以保存一个任务列表。消息队列如何处理不添加更多工作角色或并行运行任务?
    • 您可以禁用自动缩放并仅部署固定数量或将处理来自队列的消息的工作人员。
    • 队列将如何处理我代码中执行任务方法的代码?队列只保存一些消息。你是说我用我的代码部署一个项目并增加 Azure 管理员中的角色数量?
    • 是的,每个实例都将运行相同的代码,并且只会继续选择队列中的第一条消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 2011-08-22
    • 2014-11-09
    • 1970-01-01
    相关资源
    最近更新 更多