StorageClientException: указанное сообщение не существует? - PullRequest
1 голос
/ 27 апреля 2010

У меня есть простая рабочая роль кодирования видео, которая извлекает сообщения из очереди, кодирует видео и затем загружает видео в хранилище. Кажется, что все работает, но иногда при удалении сообщения после того, как я закончу кодирование и загрузку, я получаю «StorageClientException: указанное сообщение не существует.» Хотя видео обрабатывается, я полагаю, что сообщение появляется снова в очереди, потому что он не удаляется правильно. У меня установлено сообщение visablilty, равное 5 минутам, ни одно из видео не заняло более двух минут.

  • Возможно ли, что другой экземпляр рабочей роли является обработка и удалить сообщение?
  • Не мешает ли 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);
            }
        }
    }

Ответы [ 3 ]

1 голос
/ 27 апреля 2010

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

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

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

1 голос
/ 27 апреля 2010

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

0 голосов
/ 01 мая 2010

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

...