我创建了一个预定的任务系统。我使用半个核心的Windows Azure辅助角色。我从SQL Azure数据库中提取任务,我将其排队并出列。 任务可以彼此独立运行。我估计每个工作者角色可以在一小时内执行30个任务。随着我的解决方案的发展,我担心我必须为每个新的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)
{
}
}
}
答案 0 :(得分:2)
工作者角色是否是我业务需求的错误解决方案?
绝对不是。工作者角色仅用于此目的 - 处理后台任务。
每个辅助角色项目的代码都是相同的。我有办法吗? 可以执行以下代码以获得更多的工作者角色而无需添加 另一个项目?
正如@Jakub所提到的,您可以让许多同一个工作者角色的实例正在运行处理任务。它们的关键是一个任务仅由一个工作者角色实例处理。
您可以做的一件事是实现某种主/从实现,其中一个工作者角色实例将从数据库中获取任务,将它们推入队列(主服务器),然后所有其他工作者角色实例(从服务器)将获取队列和流程任务中的数据。我前段时间写了一篇博文,介绍了这种方法,你可能会发现它很有用:http://gauravmantri.com/2013/01/23/building-a-simple-task-scheduler-in-windows-azure/。
答案 1 :(得分:1)
我会使用消息队列来排队工作(消息可以只指向数据库中的记录) - 你可以比使用自动缩放,不需要自己轮询数据库,没有同步工作的问题分发(确保2个辅助角色不从DB中选择相同的任务)。