【问题标题】:How to start processing task simultaneously in azure worker role如何在 azure worker 角色中同时开始处理任务
【发布时间】:2014-02-25 22:50:41
【问题描述】:

我开发了工人角色应用程序来处理不同的任务。例如 Task1,task2 有 100 条记录,我已将主题存储在队列中,我想同时开始处理并跨多个实例加载。

未来会有更多的任务,任务中要处理的记录也会增加。 那么如何改进以下方法以有效地处理记录?

目前我已按如下顺序完成代码

  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()

标签: c# multithreading azure azure-worker-roles


【解决方案1】:

根据这个问题的评论,它引导我搜索只有 1 个队列用于多种数据项的替代解决方案,我在这里得到了解决方案

How to use one object to store multiple type of data

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 2013-04-08
    • 2013-05-30
    相关资源
    最近更新 更多