1

我的任務是提高處理隊列中消息的工作角色的性能。Azure QueueClient MaxConcurrentCalls無法正常工作

它使用queueclient.OnMessage模型MaxConcurrentCalls設置爲1。

在該處理期間存在的Thread.Sleep 5分鐘,並且將妨礙整體性能即,如果我在隊列10周的消息將需要至少45分鐘在處理前10日消息

我想如果我改變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已處理,因此我無法在任務線程中使用),而且我有理智也對它進行了測試,但我不相信這是最好的解決方案。

+0

忘了提及任務方法的最大缺點,如果某些事情在處理失敗,我們會丟失消息,而默認情況下,消息可能會在隊列中。 – DShah

+0

睡眠的目的是什麼?模擬一個漫長的過程?你有沒有嘗試使你的SomeTask函數異步? – Thomas

+0

是@Thomas,睡眠模擬長時間運行的過程。我試圖從SomeTask方法返回任務,使其異步,但沒有工作,因爲代碼仍然使用睡眠,但後來我遇到了C#多線程的另一個線程(http://stackoverflow.com/questions/14177891/can-別人 - 請解釋 - 異步 - 等待),我意識到我需要使用Task.Delay,並按我的預期工作 – DShah

回答

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)以允許調度程序管理要執行的線程。

+0

謝謝@Sean,對於遲到的回覆感到抱歉,因爲我離開了,但這正是我在去假期之前所做的它的工作。關鍵是使用Task.Delay而不是Thread.Sleep,我從http://stackoverflow.com/questions/14177891/can-somebody-please-explain-async-await實現。 – DShah

+0

一切都很好。很高興你得到它。 –