Как долго сообщение остается скрытым в очереди Azure, прежде чем оно снова станет видимым?

В любой обычной очереди Azure я выдаю сообщение и выполняю некоторую работу. Я не хотел удалять сообщение, пока работа не будет сделана.

Как долго это сообщение остается скрытым, прежде чем оно будет признано неудачным и снова станет видимым в очереди?

eg.

var message = myQueue.GetMessage();

 // Do Work ..

myQueue.DeleteMessage();

Моя работа могла занять .. 30 секунд или около того. или что будет, если на это ушло .. 1 мин или 2?

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

Можем ли мы установить время «спрятаться»?


person Pure.Krome    schedule 16.10.2013    source источник


Ответы (2)


Можем ли мы установить время «спрятаться»?

да. Вы можете установить время, в течение которого сообщение будет скрыто от других абонентов. Если вы посмотрите документацию по REST API для Get Messages, она ожидает параметр с именем visibilitytimeout. Этот параметр отвечает за скрытие сообщения на указанное количество секунд. По истечении этого периода времени сообщение снова станет видимым, если его не удалить.

Как долго это сообщение остается скрытым, прежде чем оно будет признано неудачным и снова станет видимым в очереди?

Если вы используете клиентскую библиотеку .Net Storage, у вас есть возможность указать период ожидания видимости. Ознакомьтесь с документацией для Get Message, где можно указать время ожидания видимости. Поскольку это необязательный параметр в библиотеке (но обязательный на уровне REST API), значение по умолчанию, предоставляемое библиотекой, составляет 90 секунд.

person Gaurav Mantri    schedule 16.10.2013
comment
Что произойдет, если истекло время ожидания видимости, сообщение снова стало видимым, и я попытаюсь удалить это сообщение, потому что моя работа заняла больше времени, чем период тайм-аута видимости? - person Ashutosh Singh; 06.09.2015
comment
Когда вы удаляете сообщение из очереди (используя Get Message), вы получаете popreceipt, который вы используете для удаления сообщения. Это popreceipt остается действительным до тех пор, пока сообщение времени снова не будет удалено из очереди. Таким образом, пока ваше сообщение не удалено из очереди, вы можете удалить его, даже если истек период ожидания видимости. Прочтите раздел примечаний здесь: msdn.microsoft.com/en-us/ library / azure / dd179347.aspx. HTH. - person Gaurav Mantri; 06.09.2015
comment
Основываясь на вашем объяснении, будет ли тайм-аут INvisibility (когда невидимость истек) более подходящим именем? - person Michael Freidgeim; 16.05.2019
comment
Ссылка "Получить сообщение" не работает. Если это должно быть docs.microsoft.com/en-us/dotnet/api/? Также откуда взялось значение по умолчанию для тайм-аута видимости 90 секунд? согласно docs.microsoft.com/en-us/rest/ Значение api / storageservices / Get-Messages visibilitytimeout по умолчанию составляет 30 секунд. - person Michael Freidgeim; 06.08.2019

Вы можете указать время ожидания видимости в качестве параметра для одной из перегрузок GetMessage (). Вы также можете использовать UpdateMessage (), чтобы сделать сообщение невидимым. Однако вы никогда не можете гарантировать, что сообщение не будет обработано дважды - например, потребитель умрет, выполнив работу, но до удаления сообщения. Очереди Windows Azure - это оптимальная очередь FIFO с семантикой как минимум один раз.

person Neil Mackenzie    schedule 16.10.2013
comment
Есть ли способ снова сделать сообщения видимыми до того, как истечет период тайм-аута видимости? Допустим, я случайно установил тайм-аут на 3 дня и хочу просмотреть сообщения через пару часов? - person Martin Nilsson; 08.11.2016
comment
Вы можете использовать CloudQueue.UpdateMessage (docs.microsoft.com/en-us/dotnet/api/), установив тайм-аут в 1 секунду, чтобы он снова появился в ближайшее время. Однако не уверен в том, какой вариант использования для этого, поскольку у вас уже должно быть сообщение, чтобы сократить время, открывая его другим. - person sscheider; 25.10.2018