Подтвердить что ты не робот

WebJob обрабатывает несколько сообщений за раз от очереди

WebJob обрабатывает несколько сообщений из очереди, которые мне не нужны. Моя очередь имеет зависимые сообщения, которые я хочу обрабатывать один за другим последовательно. Я попытался с настройкой "BatchSize" на 1, но не повезло. Тем не менее, он обрабатывает более одного сообщения за раз.

4b9b3361

Ответ 1

Параметр BatchSize (JobHostConfiguration.Queues.BatchSize) не относится к обработке очереди ServiceBus, только к Azure Queues. Чтобы настроить обработку очереди ServiceBus, используйте ServiceBusConfiguration. Ручка, которую вы хотите настроить, - ServiceBusConfiguration.MessageOptions.MaxConcurrentCalls. Установите для этого параметра значение 1, чтобы отключить параллельную обработку в одном экземпляре (по умолчанию 16):

JobHostConfiguration config = new JobHostConfiguration();
ServiceBusConfiguration serviceBusConfig = new ServiceBusConfiguration();
serviceBusConfig.MessageOptions.MaxConcurrentCalls = 1;
config.UseServiceBus(serviceBusConfig);

JobHost host = new JobHost(config);
host.RunAndBlock();

Это гарантирует, что только одно сообщение обрабатывается одновременно в одном экземпляре. Если ваш WebApp будет масштабирован, каждый масштабированный экземпляр будет запущен в этом режиме, то есть вы будете иметь параллельную обработку между экземплярами. Если вы тоже этого не хотите, вы можете использовать SingletonAttribute, чтобы гарантировать, что только один экземпляр вашей функции работает через экземпляры. Дополнительную информацию см. В вики-странице Singleton.

Ответ 2

Если ваши сообщения имеют некоторую зависимость от заказа, у вас, скорее всего, есть конвейер операций. У меня есть конкретный сценарий, когда я использую Azure Queues вместо ServiceBus, но я считаю, что следующая идея могла бы применить одно и то же:

У меня есть процесс автоматизации, который: 1) создает базу данных, 2) создает веб-приложение, 3) настраивает веб-приложение и 4) развертывает код. В моем случае все должно быть сделано в этом порядке.

В этом случае я создал одну очередь для каждой задачи: create-database-queue, create-webapp-queue, configure-web-app и deploy-app-queue.

Вы намного безопаснее работать таким образом, потому что вы изолируете задачи. Как только один процесс в одной очереди заканчивается, он может быть перенесен в следующую очередь. Кроме того, вы можете легко вставить новый шаг в свой процесс. Например, я могу легко вставить новый шаг 1.5) Restore database backup без второй мысли.

Кроме того, вы поощряете разделение обязанностей с отдельными очередями.

Ответ 3

Какая именно очередь зависит в основном от успеха того, что вы делаете. Я не уверен, почему вы получаете проблемы с очередью batchsize - Azure Storage Queue дает вам одно сообщение за другим, равно как и служебную шину.

Azure WebJobs будет масштабироваться с вашим количеством сайтов, на которых вы их размещаете, что может дать вам проблемы concurrency, т.е. если у вас есть процессор очереди, поскольку веб-приложение работает непрерывно, то если ваш веб-сайт масштабируется до двух экземпляров, у вас будет два WebJobs, которые также сражаются за одну и ту же очередь.

Итак, если вам нужен один процессор очереди для работы, возможно, это будет лучшее решение для переноса webjob в облачную службу, где у вас есть 100% контроль над количеством экземпляров, чистое разделение с WebSites и их экземпляры,

Поскольку вам нужно обрабатывать каждое сообщение поочередно, один за другим, не имеет смысла масштабировать количество процессоров, потому что им нужно будет ждать, пока следующее сообщение будет обработано, так как пока это и вы МОЖЕТЕ хотеть масштабировать свои веб-сайты, я бы предложил CloudService как лучший способ пойти.