StorageClientException: указанное сообщение не существует?

У меня есть простое видео, кодирующее роль рабочего, что сообщения получений по запросу от очереди кодируют видео, затем загружает видео на устройство хранения данных. Все, кажется, работает, но иногда при удалении сообщения после того, как я сделан, кодируя и загружая, я получаю "StorageClientException: указанное сообщение не существует". Хотя видео обрабатывается, я полагаю, что сообщение вновь появляется в очереди, потому что это не удаляется правильно. У меня есть сообщение visablilty набор к 5 минутам, ни одно из видео не взяло больше чем 2 для обработки.

  • Действительно ли возможно, что другой экземпляр роли Рабочего обрабатывает и удаляет сообщение?
  • Не GetMessage () препятствуют тому, чтобы другие роли рабочего забрали то же сообщение?
  • Я делаю что-то не так в установке моей очереди?
  • Что могло заставлять это сообщение не быть найденным на, удаляют?

некоторый код...

  //onStart() queue setup
  var queueStorage = _storageAccount.CreateCloudQueueClient();
  _queue = queueStorage.GetQueueReference(QueueReference);
  queueStorage.RetryPolicy = RetryPolicies.Retry(5, new TimeSpan(0, 5, 0));
  _queue.CreateIfNotExist();


 public override void Run()
  {
        while (true)
        {
            try
            {
                var msg = _queue.GetMessage(new TimeSpan(0, 5, 0));
                if (msg != null)
                {
                   EncodeIt(msg);
                   PostIt(msg);
                   _queue.DeleteMessage(msg);
                }
                else
                {
                    Thread.Sleep(WaitTime);
                }
            }
            catch (StorageClientException exception)
            {
                BlobTrace.Write(exception.ToString());
                Thread.Sleep(WaitTime);
            }
        }
    }
1
задан Aaron 27 April 2010 в 18:10
поделиться

3 ответа

Моя разработка, производство и этап выполнялись из одной очереди, что вызывало странное поведение. Я считаю, что это виноват.

0
ответ дан 3 September 2019 в 01:00
поделиться

Если процесс кодирования занимает больше времени, чем таймаут невидимости сообщения (5 минут в вашем случае), то сообщение снова появится в очереди . Это заставит второго воркера начать его обработку. Однако есть вероятность, что к тому времени, когда второй воркер закончит обработку, первый воркер уже завершит работу, удалив ее должным образом. Это приведет к сбою второго воркера на этапе удаления, поскольку сообщение для него больше не существует.

Это происходит из-за облегченной модели транзакций Windows Azure Queues . Это гарантирует, что сообщение будет обработано хотя бы один раз (даже если рабочий отказывает тихо), но не гарантирует «только однократную» обработку .

Поскольку ваш процесс кодирования кажется идемпотентным и легким (поскольку ошибка появляется нечасто), я бы просто посоветовал увеличить тайм-аут невидимости и явно зафиксировать это исключение ( по кодам состояния) вокруг DeleteMessages (необязательно регистрируя продолжительность процесса, чтобы иметь возможность настраивать таймауты невидимости в дальнейшем).

1
ответ дан 3 September 2019 в 01:00
поделиться

Неужели это может занять больше пяти минут, установленных вами в качестве тайм-аута?

{{ 1}}
1
ответ дан 3 September 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: