Что вызывает разногласия потоков с моим кодом очереди Azure? - PullRequest
2 голосов
/ 27 июля 2010

Я только что запустил профилировщик потоков Visual Studio 2010 в своем коде Azure и заметил, что получаю массу споров.Мой код блокируется чаще, чем он работает!

У моего работника вообще нет собственной логики потоков.Это простой цикл, который запрашивает различные очереди, если у них есть работа.Я создаю экземпляр QueueRepositoryClass и затем вызываю функцию GetQueueMessage.

Похоже, что по какой-то причине несколько потоков сталкиваются с моим методом GetQueueMessage и используют один и тот же экземпляр queueClient.Возможно, это результат моего использования объекта CloudStorageAccount?Или это метод расширения CreateCloudQueueClient?

Ответы [ 2 ]

3 голосов
/ 27 июля 2010

Не видя вызывающего кода, это отчасти предположение, но может показаться, что вы вызываете GetMessage () в довольно узком цикле. GetMessage - это синхронный вызов, в результате чего этот конкретный поток сам блокируется, ожидая ответа из очереди (другие потоки продолжают работать). В профилировщике это будет выглядеть очень плохо, потому что остальная часть логики цикла выполняется так быстро (т. Е. Вы тратите на выполнение кода одну или две мс, а получение сообщения в течение 50 мс будет выглядеть именно так).

Еще одно замечание: вам нужно быть очень осторожным, запрашивая очередь в тесных циклах по нескольким причинам:

1) Хотя плата за Tx мала, но не равна 0. Я обычно предлагаю некоторую логику отключения - то есть, если очередь пуста, подождите 100 мс, прежде чем проверять снова. Пустой дважды, обратно до 500 мс и т. Д. Очевидно, что вы должны сбалансировать это с пользовательским опытом, к которому вы стремитесь.

2) Если вы в конечном итоге масштабируете приложение - вы эффективно создаете DoS-атаку на очереди. 100 экземпляров, стучащих в очередь в тесной петле, могут действительно повредить перфекту.

Pat

0 голосов
/ 28 июля 2010

Я перешел на использование методов Async QueueClient, и теперь вся система работает намного лучше.

...