Azure工作者角色多线程队列处理

Azure工作者角色多线程队列处理,azure,cloud,azure-worker-roles,azure-cloud-services,Azure,Cloud,Azure Worker Roles,Azure Cloud Services,我有一个azure云服务,具有经典配置WebRole+Worker角色。 工作者从队列中获取消息,对其进行处理,然后一次删除一次 我的代码如下: public override void Run() { Trace.TraceInformation("Worker is running"); try { this.RunAsync(this.cancellationTokenSource.To

我有一个azure云服务,具有经典配置WebRole+Worker角色。 工作者从队列中获取消息,对其进行处理,然后一次删除一次

我的代码如下:

public override void Run()
    {
        Trace.TraceInformation("Worker is running");
            try
            {
                this.RunAsync(this.cancellationTokenSource.Token).Wait();
            }
            finally
            {
                this.runCompleteEvent.Set();
            }
    }

public override bool OnStart()
        {
            ServicePointManager.DefaultConnectionLimit = 500;
            bool result = base.OnStart();
            Trace.TraceInformation("WorkerAnalytics has been started");
            return result;
        }



private async Task RunAsync(CancellationToken cancellationToken)
        {
            var queue = ....//omitted info for brevity
            CloudQueueMessage retrievedMessage = null;

            while (!cancellationToken.IsCancellationRequested)
            {
                 try
                    {
                        retrievedMessage = await queue.GetMessageAsync();
                        if (retrievedMessage != null)
                        {
                            await ProcessMessage(retrievedMessage);
                        }
                        else
                        {
                            System.Threading.Thread.Sleep(500);
                        }
                    }
                    catch (Exception e)
                    {
                        System.Threading.Thread.Sleep(500);
                    }
                }
            }

        }
现在这可以很好地工作,但是CPU非常低,为3%,一次只处理一个元素(每个大约1秒),但是队列每秒大约有1000个新元素,这是不够的

如何使用机器的所有CPU能力一次处理更多队列消息,而不使此代码复杂化?

还有ServicePointManager.DefaultConnectionLimit的作用是什么?

我花了几个小时寻找一个有效的多线程解决方案来解决工作者角色,但现在所有的WebJobs或旧框架都使事情复杂化了


谢谢

您可以尝试运行多个tak的
RunAsync()

var tasks=newlist();
tasks.Add(this.RunAsync(this.cancellationTokenSource.Token));
tasks.Add(this.RunAsync(this.cancellationTokenSource.Token));
tasks.Add(this.RunAsync(this.cancellationTokenSource.Token));
Task.WaitAll(tasks.ToArray());

谢谢,这似乎有效!您建议创建多少任务?azure机器是双核机器,具有3GB RAM。队列填充速度非常快,比如每秒1000条新记录,我想我需要很多实例。我们会尝试逐渐增加任务数量,并找到合适的任务数量。如果您开始看到高CPU或性能下降,请升级到更大的VM或运行多个worker实例role@pauliusnrk我需要在哪里写这段代码?不是这行“this.RunAsync(this.cancellationTokenSource.Token).Wait();”?我得到了答案,但现在我有另一个问题:@pauliusrk有没有办法在运行时分配新任务?因为我不想在达到某个阈值时一直使用15-20个任务……有办法做到这一点吗?如果你想根据你的工作负载启动/停止新任务,你可以启动单独的任务任务,该任务会根据你的工作负载启动/停止任务
var tasks = new List<Task>();
tasks.Add(this.RunAsync(this.cancellationTokenSource.Token));
tasks.Add(this.RunAsync(this.cancellationTokenSource.Token));
tasks.Add(this.RunAsync(this.cancellationTokenSource.Token));
Task.WaitAll(tasks.ToArray());