C# Azure工作人员角色计划任务

C# Azure工作人员角色计划任务,c#,multithreading,azure,C#,Multithreading,Azure,我已经创建了一个计划任务系统。我使用的是具有半个核心的Windows Azure工作角色。我正在从SQLAzure数据库中提取任务,并对其进行排队和出列任务可以独立运行。我估计每个工人角色可以在一小时内执行三十个任务。随着我的解决方案的发展,我担心我必须为每30个新客户添加一个新的工人角色。如果我有1000多个客户,我将有大约35个员工角色项目 对于我的业务需求,工人角色是错误的解决方案吗 每个工作者角色项目的代码都相同。有没有一种方法可以在不添加另一个项目的情况下为更多工作人员角色执行下面的

我已经创建了一个计划任务系统。我使用的是具有半个核心的Windows Azure工作角色。我正在从SQLAzure数据库中提取任务,并对其进行排队和出列任务可以独立运行。我估计每个工人角色可以在一小时内执行三十个任务。随着我的解决方案的发展,我担心我必须为每30个新客户添加一个新的工人角色。如果我有1000多个客户,我将有大约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)
        {


        }
    }
}
公共类WorkerRole:RoleEntryPoint
{
string conString=ConfigurationManager.ConnectionStrings[“XXX”].ConnectionString;
IJMATaskProvider m_TaskProvider;
公共覆盖无效运行()
{
//这是一个示例辅助程序实现。替换为您的逻辑。
//Trace.TraceInformation(“CloudCartConnector.TaskRole入口点名为”,“信息”);
while(true)
{
睡眠(30010);
ExecuteTasks();
睡眠(500010);
跟踪信息(“工作”、“信息”);
}
}
公共覆盖bool OnStart()
{
ServicePointManager.DefaultConnectionLimit=12;
m_TaskProvider=JMATaskFactory.Get(consting,CloudCartConnectorLogProvider.Instance);
返回base.OnStart();
}
作废性能任务(JMATask任务)
{
//更新数据库
}
公共字符串ExecuteTasks()
{
尝试
{
List tasks=m_TaskProvider.GetAllTasks();
foreach(任务中的JMATask任务)
{
执行任务;
}
返回“OK”;
}
捕获(例外情况除外)
{
}
}
}

我将使用消息队列对工作进行排队(消息可以只指向数据库中的一条记录)-您可以使用自动缩放,不需要亲自轮询数据库,也不存在工作分布同步问题(确保两个工作人员角色不从数据库中选择相同的任务).

我将使用消息队列对工作进行排队(消息可以只指向数据库中的一条记录)-您可以使用自动缩放,不需要亲自轮询数据库,也不存在工作分布同步问题(确保两个工作角色不从数据库中选择相同的任务).

我将使用消息队列对工作进行排队(消息可以只指向数据库中的一条记录)-您可以使用自动缩放,不需要亲自轮询数据库,也不存在工作分布同步问题(确保两个工作角色不从数据库中选择相同的任务).

我将使用消息队列对工作进行排队(消息可以只指向数据库中的一条记录)-您可以使用自动缩放,不需要亲自轮询数据库,也不存在工作分布同步问题(确保两个工作角色不从数据库中选择相同的任务)

对于我的业务需求,工人角色是错误的解决方案吗

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

每个工作者角色项目的代码都相同。我有办法吗 可以执行以下代码以获得更多工作人员角色,而无需添加 另一个项目

正如@Jakub所提到的,您可以有多个同一工作者角色的实例运行处理任务。这里的关键是一个任务只由一个工作者角色实例处理

您可以做的一件事是实现某种主/从实现,其中一个工作者角色实例将从数据库获取任务,将它们推送到队列(主)中,然后所有其他工作者角色实例(从)将从队列中获取数据并处理任务。不久前我写了一篇博客文章,描述了这种方法,您可能会发现它很有用:

对于我的业务需求,工人角色是错误的解决方案吗

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

每个工作者角色项目的代码都相同。我有办法吗 可以执行以下代码以获得更多工作人员角色,而无需添加 另一个项目

正如@Jakub所提到的,您可以有多个同一工作者角色的实例运行处理任务。这里的关键是一个任务只由一个工作者角色实例处理

您可以做的一件事是实现某种主/从实现,其中一个工作者角色实例将从数据库获取任务,将它们推送到队列(主)中,然后所有其他工作者角色实例(从)将从队列中获取数据并处理任务。不久前我写了一篇博客文章,描述了这种方法,您可能会发现它很有用:

对于我的业务需求,工人角色是错误的解决方案吗

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

每个工作者角色项目的代码都相同。我有办法吗 可以执行以下代码以获得更多工作人员角色,而无需添加 另一个项目

正如@Jakub所提到的,您可以有多个同一工作者角色的实例运行处理任务。这里的关键是一个任务只由一个工作者角色实例处理

您可以做的一件事是实现某种主/从实现,其中一个工作者角色实例将从数据库获取任务