1
我開發了工作角色應用程序來處理不同的任務。例如任務1,任務2有100條記錄,我已經將主題存儲在隊列中,並且我想要同時開始處理並跨越多個實例的負載。如何在azure工作角色中同時開始處理任務
將來會有更多的任務和記錄裏面的任務處理會增加。 那麼我該如何改進以下方法來有效地處理記錄?
目前,我已經做了代碼順序如下
private void ProcessTaskQueues()
{
var currentInterval1 = 0;
var maxInterval1 = 15;
var currentInterval2 = 0;
var maxInterval2 = 15;
string queueName1 = RoleEnvironment.GetConfigurationSettingValue("Task1Queue");
CloudQueue queue1 = storageAccount.CreateCloudQueueClient().GetQueueReference(queueName1);
queue1.CreateIfNotExists();
string queueName2 = RoleEnvironment.GetConfigurationSettingValue("Task2Queue");
CloudQueue queue2 = storageAccount.CreateCloudQueueClient().GetQueueReference(queueName2);
queue2.CreateIfNotExists();
while (true)
{
try
{
TaskPerformer tp = new TaskPerformer();
// Task 1
Trace.WriteLine(string.Format("[{0}] - [TASK1] Fetch Message queue", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
var cloudQueueMessage1 = queue1.GetMessage();
if (cloudQueueMessage1 != null)
{
currentInterval1 = 0;
if (cloudQueueMessage1.DequeueCount <= 1)
{
var item = cloudQueueMessage1.FromMessage<Task1Item>();
tp.ExecuteTask1(item);
Trace.WriteLine(string.Format("[{0}] - [TASK1] Message Executed for ID : {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), item.MLPID));
queue2.DeleteMessage(cloudQueueMessage1);
}
}
else
{
if (currentInterval1 < maxInterval1)
{
currentInterval1++;
Trace.WriteLine(string.Format("[{0}] - Waiting for {1} seconds", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), currentInterval1));
}
Thread.Sleep(TimeSpan.FromSeconds(currentInterval1));
}
// Task 2
Trace.WriteLine(string.Format("[{0}] - [TASK2] Fetch Message queue", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
var cloudQueueMessage2 = queue2.GetMessage();
if (cloudQueueMessage2 != null)
{
currentInterval2 = 0;
if (cloudQueueMessage2.DequeueCount <= 1)
{
var dns = cloudQueueMessage2.FromMessage<DNS>();
tp.ExecuteTask2(dns);
Trace.WriteLine(string.Format("[{0}] - [TASK2] Message Executed for ID : {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), dns.ID));
queue2.DeleteMessage(cloudQueueMessage2);
}
}
else
{
if (currentInterval2 < maxInterval2)
{
currentInterval2++;
Trace.WriteLine(string.Format("[{0}] - Waiting for {1} seconds", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), currentInterval2));
}
Thread.Sleep(TimeSpan.FromSeconds(currentInterval2));
}
}
catch (Exception)
{ }
}
}
是否有一個特別的原因,你使用不同的隊列爲每個任務類型?您可以將所有任務推送到一個隊列中,當您獲取消息時,可以從消息中找出任務類型並相應地處理任務。 –
@GauravMantri基本上我有2種不同類型的輔助方法將二進制轉換爲二進制和隱藏的二進制,所以我如何映射隊列? 即 var item = cloudQueueMessage1.FromMessage(); var dns = cloudQueueMessage2.FromMessage () –