Azure QueueClient MaxConcurrentCalls不起作用

时间:2016-09-16 11:34:20

标签: multithreading azure azureservicebus azure-servicebus-queues

我的任务是改善处理队列中消息的辅助角色的性能。

它将queueclient.OnMessage模型与MaxConcurrentCalls设置为1。

在处理过程中有thread.sleep 5分钟,这将妨碍整体性能,即如果队列中有10条消息,则在处理第10条消息之前至少需要45分钟

我想如果我改变MaxConcurrentCalls让它说5然后它应该并行处理5条消息并将等待时间减少25分钟但是这不起作用:(

此外,我尝试将OnMessageAsync与MaxConcurrentCalls一起使用,但没有运气。下面是我试过的片段,

.OnMessageAsync( async (brokeredMessage) =>
{                
    bool shouldAbandon = false;
    try
    {
        logger.Debug("Rcvd:" + brokeredMessage.SequenceNumber);
        SomeTask(brokeredMessage);
        await brokeredMessage.CompleteAsync();
    }
    catch (Exception ex)
    {
        logger.Error(String.Format("An Error occured {0}", ex.ToString()));
        shouldAbandon = true;
    }
    if (shouldAbandon)
    {
        await brokeredMessage.AbandonAsync();
    }   
}, new OnMessageOptions { AutoComplete = false, MaxConcurrentCalls = 10 });

private void SomeTask(BrokeredMessage bm)
{            
    logger.Debug("id: " + bm.MessageId + "on thread: " + Thread.CurrentThread.ManagedThreadId);
    Thread.Sleep(30 * 1000);
    logger.Debug("seq: " + bm.SequenceNumber);
    logger.Debug("body: " + bm.GetBody<string>());
}

我能想到的最后一个选项是在OnMessage事件上启动一个新任务。我需要处理几件事情(确保从集合/主线程中删除已完成的任务并从BrokeredMessage传递一个对象,因为BrokeredMessage已被处理,因此我无法在Task线程上使用)我也有理智测试它,但我不相信这是最好的解决方案。

1 个答案:

答案 0 :(得分:1)

SomeTask实施替换为以下内容:

async Task SomeTask(BrokeredMessage bm)
{
     logger.Debug("id: " + bm.MessageId + "on thread: " + Thread.CurrentThread.ManagedThreadId);
     await Task.Delay(30 * 1000).ConfigureAwait(false);
     logger.Debug("seq: " + bm.SequenceNumber);
     logger.Debug("body: " + bm.GetBody<string>());
}

Thread.Sleepasync在同一个帖子(在您的情况下)中混合时,会导致线程“停顿”。所有的任务。由于没有UI工作,所以更喜欢在异步操作上使用.ConfigureAwait(false)来允许调度程序管理要执行的线程。