我的任務是提高處理隊列中消息的工作角色的性能。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已處理,因此我無法在任務線程中使用),而且我有理智也對它進行了測試,但我不相信這是最好的解決方案。
忘了提及任務方法的最大缺點,如果某些事情在處理失敗,我們會丟失消息,而默認情況下,消息可能會在隊列中。 – DShah
睡眠的目的是什麼?模擬一個漫長的過程?你有沒有嘗試使你的SomeTask函數異步? – Thomas
是@Thomas,睡眠模擬長時間運行的過程。我試圖從SomeTask方法返回任務,使其異步,但沒有工作,因爲代碼仍然使用睡眠,但後來我遇到了C#多線程的另一個線程(http://stackoverflow.com/questions/14177891/can-別人 - 請解釋 - 異步 - 等待),我意識到我需要使用Task.Delay,並按我的預期工作 – DShah