12

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

ответ

-3

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

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

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

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

+1

FYI вы можете настроить WebJobs как Singleton. Так что нет необходимости переходить на облачную службу, если это единственное, чего вы хотите достичь. – lopezbertoni

13

Параметр 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 wiki page для получения дополнительной информации.

+0

Спасибо, только что мне нужно –

0

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

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

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

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

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