У меня есть одна рабочая роль, которая выбрасывает данные примерно в 10 очередей, которые необходимо обработать.Существует много данных - около 10-100 сообщений в секунду, которые ставятся в очередь в различных очередях.
Очереди содержат разные данные и обрабатывают их отдельно.В частности, существует одна очень активная очередь.
Как у меня сейчас настроено, у меня есть отдельная рабочая роль, которая порождает 10 разных потоков, каждый поток выполняет метод, имеющий время (true) {получить сообщение из очереди и обработать его}.Всякий раз, когда данные в очереди резервируются, мы просто запускаем больше этих процессов, чтобы помочь ускорить обработку данных из очереди.Кроме того, поскольку одна очередь более активна, я запускаю несколько потоков, указывающих на один и тот же метод для обработки данных из этой очереди.
Однако я вижу высокую загрузку ЦП при развертывании.Почти на или около 100% постоянно.
Мне интересно, это из-за голодания нити?Или потому что доступ к очереди является RESTful и потоки блокируют друг друга, устанавливая соединение и замедляя процесс?Или это потому, что я использую:
while(true)
{
var message = get message from queue;
if(message != null)
{
//process message
}
}
И это выполняется слишком быстро?
Каждая обработка сообщения также сохраняет его в хранилище таблиц Azure или в БД - так что это может быть процесс сохранения этих данных, которые поглощают ЦП.
По сути, было очень сложно отладить высокую загрузку процессора.Итак, мой вопрос: есть ли общие изменения архитектуры, которые я могу сделать, которые помогут облегчить + предотвратить любую возможную проблему, которая может быть?(например, вместо использования while (true) с использованием другого типа опроса - хотя я думаю, что в конце этого примера то же самое).
Может быть, просто порождение новых потоков с использованием new Thread () - не лучший способ.