3 Stimmen

StorageClientException: Die angegebene Nachricht existiert nicht?

Ich habe eine einfache Videocodierungs-Arbeiterrolle, die Nachrichten aus einer Warteschlange abruft, ein Video codiert und dann das Video in den Speicher hochlädt. Alles scheint zu funktionieren, aber gelegentlich erhalte ich beim Löschen der Nachricht nach dem Kodieren und Hochladen eine "StorageClientException: Die angegebene Nachricht existiert nicht." Das Video wird zwar verarbeitet, aber ich glaube, dass die Nachricht in der Warteschlange wieder auftaucht, weil sie nicht korrekt gelöscht wird. Ich habe die Sichtbarkeit der Nachricht auf 5 Minuten eingestellt, keines der Videos hat länger als 2 Minuten für die Verarbeitung gebraucht.

  • Ist es möglich, dass eine andere Instanz der Worker-Rolle die Nachricht bearbeitet und die Nachricht löscht?
  • Verhindert die Funktion GetMessage() nicht andere Arbeiterrollen daran, die die gleiche Nachricht?
  • Mache ich etwas falsch in der Einrichtung meiner Warteschlange?
  • Was könnte die Ursache für diese Meldung sein? beim Löschen nicht gefunden wird?

etwas Code...

  //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);
            }
        }
    }

3voto

Rinat Abdullin Punkte 22138

Si der Kodierungsprozess mehr Zeit in Anspruch nimmt als die Unsichtbarkeitszeit der Nachricht (in Ihrem Fall 5 Minuten), dann wird die die Nachricht wird wieder in der Warteschlange erscheinen . Dies führt dazu, dass der zweite Arbeiter mit der Verarbeitung beginnt. Es besteht jedoch die Möglichkeit, dass zu dem Zeitpunkt, an dem der zweite Arbeiter die Verarbeitung beendet, der erste Arbeiter bereits mit der Arbeit fertig ist und sie ordnungsgemäß löscht. Dies wird dazu führen, dass der zweite Arbeiter in der Löschphase scheitert, da die Nachricht für ihn nicht mehr existiert.

Dies geschieht aufgrund der leichtgewichtiges Transaktionsmodell durch Windows Azure Queues . Sie garantiert, dass die die Nachricht wird mindestens einmal bearbeitet (auch wenn der Arbeiter stillschweigend ausfällt), aber garantiert keine "einmalige" Verarbeitung .

Da Ihr Verschlüsselungsprozess idempotent und leichtgewichtig zu sein scheint (da Fehler nur selten auftreten), würde ich einfach dazu raten das Zeitlimit für die Unsichtbarkeit erhöhen y diese Ausnahme ausdrücklich zu erfassen (nach Statuscodes) um DeleteMessages (optional mit Protokollierung der Prozessdauer, um die Unsichtbarkeits-Timeouts weiter anpassen zu können).

0 Stimmen

Ich habe die Videos gestoppt, keines davon dauert länger als 2 Minuten.

1 Stimmen

Bei azurblauem Stoff kann man nie wissen. Ich würde empfehlen, die Verarbeitungszeit und alle unbehandelten Ausnahmen zu speichern, um die möglichen Kollisionen post mortem zu debuggen.

1voto

user94559 Punkte 57151

Kann es sein, dass es länger als die fünf Minuten dauert, die Sie als Timeout eingestellt haben?

0 Stimmen

Keines der Videos hat länger als 2 Minuten gedauert.

0 Stimmen

Nun, der Code, den Sie hier eingefügt haben, sieht gut aus, also würde ich mir den Rest des Codes ansehen oder mehr Logging hinzufügen, um zu versuchen, ihn zu debuggen... nichts hier sieht verdächtig aus.

0voto

Aaron Punkte 1013

Ich hatte meine Entwicklung, Produktion und Bühne alle ziehen aus der gleichen Warteschlange war dies einige seltsame Verhalten verursacht. Ich glaube, dass dies der Übeltäter ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X