1

Мой webapi должен выполнить набор тяжелых операций, чтобы заполнить запрос. Чтобы свести к минимуму время обработки, я разгружаю «инкремент счетчика просмотров» на веб-сайт.Медленная лазурная работа webjob (локальный разработчик)

То, как я это делаю, заключается в том, что в конце каждого запроса помещается сообщение с именем userId и productId для хранения очереди в лазурной области. Функция webjob запускает новые сообщения в очереди и после разбора сообщения добавляет значения (добавляет или добавляет новые) в статический параллельный словарь.

Я не увеличиваю и не пишу на лазурную таблицу, потому что хотел бы использовать другой веб-сайт на основе таймера, чтобы сохранить значения из параллельного словаря в таблицу, чтобы избежать чрезмерной записи.

В то время как никакие сообщения не теряются, и все значения записываются/добавляются должным образом в dict, я вижу очень низкую производительность. Для обработки 1000 сообщений требуется более 5 минут. сообщения приходят в пачках и обрабатываются медленнее параллельно, чем когда я устанавливаю BATCHSIZE 1. Мои настройки webjob являются:

config.Queues.BatchSize = 32; 
config.Queues.NewBatchThreshold = 100; 
config.Queues.MaxPollingInterval = TimeSpan.FromSeconds(2); 
config.Queues.MaxDequeueCount = 3; 

Спектакля, кажется, не страдает из-за столкновения словаря, как те, кажется, быстро обрабатывается. Мой таймер показывает, что для обработки каждого приращения требуется от 0 до 9 мс, поэтому 1000 сообщений должны занимать не более 9 секунд. Является ли webjob отстающим/холостым, и это по дизайну? При какой максимальной скорости веб-процесс может обрабатывать очередь? Есть ли какие-либо другие настройки, которые я могу настроить, чтобы заставить webjob работать быстрее? Существуют ли другие способы решения этой задачи «увеличить число просмотров», учитывая, что у меня может быть много сообщений с разными userIds/productIds?

+0

'' Сообщения поступают в пакеты и обрабатываются медленнее параллельно, чем когда я устанавливаю BatchSize в 1.'', вы имеете в виду, что это быстрее, если параметр BatchSize равен 1? сколько минут требуется для обработки этих 1000 сообщений с помощью BatchSize = 1? –

+0

Привет, Фред, спасибо за ответ. Я просто перезапустил свой тест для сообщений 1k с BatchSize = 1 и увидел, что для обработки требуется 6 минут, поэтому параллельно это происходит быстрее. Я перечеркнула свое первоначальное заявление из вопроса. Считаете ли вы, что по-прежнему можно обрабатывать сообщения быстрее, чем текущая скорость 1k/5min параллельно? –

+0

Вы включили ведение журнала очереди, чтобы узнать, что вы можете получить оттуда? Инструкции приведены на странице https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/enabling-storage-logging-and-accessing-log-data. Кроме того, является ли процесс размещением сообщений в одном центре данных? –

ответ

0

Кажется, что есть задержка в процессе webjob после набора сообщений обрабатываются и до следующего набора приобретается

Насколько я знаю, WebJobs опрашивать очередь с определенным алгоритмом опроса. Когда сообщение найдено, SDK ждет две секунды, а затем проверяет наличие другого сообщения; когда сообщение не найдено, он ждет около четырех секунд, прежде чем повторять попытку. Для получения подробной информации, пожалуйста, проверьте Алгоритм опроса тема в this article.

Кроме того, вы можете попробовать запустить WebJobs в веб-приложении Azure App Service и масштабировать WebJobs до нескольких экземпляров.