2015-08-06 3 views
4

Сценарий: производитель отправляет сообщение в очередь хранения, WebJobs обрабатывает сообщение на QueueTrigger, каждое сообщение должно обрабатываться только один раз, может быть несколько экземпляров WebJob.Очередь хранения Azure и несколько экземпляров WebJobs: будет ли QueueTrigger устанавливать время аренды сообщения при запуске?

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

Вопрос в том, когда QueueTrigger запускается на одном экземпляре WebJob, устанавливает ли он время аренды сообщения, чтобы другой WebJob не мог получить одно и то же сообщение? Если да, то почему мне нужно учитывать возможность того, что сообщение может быть обработано дважды? Или я не понимаю этого?

ответ

4

Если вы используете встроенные атрибуты триггера очереди, он автоматически гарантирует, что любое заданное сообщение обрабатывается один раз, даже когда сайт масштабируется до нескольких экземпляров. Это опубликовано в статье в разделе обсуждения, https://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk-get-started/

В этой же статье вы найдете разъяснения относительно 10-минутной аренды. Таким образом, атрибут QueueTrigger направляет SDK WebJobs для вызова метода при получении нового сообщения в очереди. Сообщение обрабатывается, и когда метод завершается, сообщение очереди удаляется. Если метод завершился неудачно, сообщение очереди не удаляется; после истечения 10-минутной аренды сообщение будет выпущено, чтобы его снова подхватили и обработали. Эта последовательность не будет повторяться бесконечно, если сообщение всегда вызывает исключение. После 5 неудачных попыток обработки сообщения сообщение перемещается в очередь ядов. Максимальное количество попыток настраивается.

3

Ваш процесс должен быть идемпотентным. Поскольку

Факты:

  • webjob арендует сообщение (Ни один другой webjob не может получить его).
  • Webjob удаляет сообщение, когда его работа выполнена.
  • Если веб-сайт выходит из строя при обработке сообщения, его аренда будет тайм-аут, а другой веб-сайт получит и начнет обрабатывать это. (По умолчанию повтор составляет 5 для messsage, после чего он переходит в очередь яда)

Так что, если webjob сбой после его работы будет сделан, но прежде чем она удаляет сообщение, то сообщение будет выпущено через некоторое время и то же самое будет сделано снова.

Поэтому ваш процесс должен быть идемпотентным.