2016-08-03 20 views
7

Ich habe ein Azure-WebJob-Projekt, das ich lokal auf meinem Dev-Computer ausgeführt habe. Es wird eine Azure Service Bus-Nachrichtenwarteschlange abgehört. Nichts läuft wie Themen, nur die grundlegendste Nachrichtenwarteschlange.So verhindern Sie, dass der Azure-Web-Job dieselbe Nachricht mehrmals gleichzeitig verarbeitet

Es empfängt/verarbeitet die gleiche Nachricht mehrmals und startet sofort zweimal, wenn die Nachricht empfangen wird, und intermittierend, während die Nachricht verarbeitet wird. Fragen

:

  • Wie komme ich bin die gleiche Nachricht mehrfach sofort erhalten? Es scheint, dass es erneut abgerufen wird, bevor ein PeekLock angewendet wird?
  • Wie kommt es, dass die Nachricht erneut empfangen wird, obwohl sie noch verarbeitet wird? Kann ich die PeekLock-Dauer festlegen oder die Nachricht irgendwie so sperren, dass sie nur einmal verarbeitet wird?
  • Wie kann ich sicherstellen, dass jede Nachricht in der Warteschlange nur einmal verarbeitet wird?
  • Ich möchte in der Lage sein, mehrere Nachrichten auf einmal zu verarbeiten, nur nicht die gleiche Nachricht mehrmals, so Einstellung MaxConcurrentCalls auf 1 scheint nicht meine Antwort zu sein, oder bin ich Missverständnis diese Eigenschaft?

Ich verwende eine Asynchron-Funktion, einfachen Injektor und eine benutzerdefinierte JobActivator, so dass anstelle einer statischen Void-Methode, meine Funktion Signatur ist:

public async Task ProcessQueueMessage([ServiceBusTrigger("AnyQueue")] MediaEncoderQueueItem message, TextWriter log) {...} 

Innerhalb des Jobs ist es, einige Dateien bewegen auf einem Blob-Dienst und Aufruf (und Warten auf) eines Medien-Encoders von Media-Diensten. Während also der Web-Job selbst nicht viel verarbeitet wird, dauert es ziemlich lange (15 Minuten für einige Dateien).

Die App wird gestartet, und wenn ich eine Nachricht in die Warteschlange einstelle, antwortet sie. Es wird jedoch die Nachricht mehrmals, sobald die Nachricht empfangen wird empfangen:

Executing: 'Functions.ProcessQueueMessage' - Reason: 'New ServiceBus message detected on 'MyQueue'.' 
Executing: 'Functions.ProcessQueueMessage' - Reason: 'New ServiceBus message detected on 'MyQueue'.' 

Zusätzlich, während die Aufgabe ausgeführt wird (und ich sehe Ausgabe von der Media Service-Funktionalität), wird es eine weitere „Kopie“ erhalten aus der Warteschlange.

Schließlich, nachdem die Aufgabe abgeschlossen ist, verarbeitet sie immer noch die gleiche Nachricht intermittierend.

+1

Wie lauten DeliveryCount und LockDuration in der Warteschlange? –

+0

Ich muss mich darum kümmern. Das Seltsame an der LockDuration ist, dass sie die Nachricht scheinbar fast sofort zweimal aufnimmt, als ob sie sie überhaupt nicht sperrt. Ich frage mich, ob es tatsächlich ein Problem mit der Art ist, wie ich den asynchronen Handler eingerichtet habe? – AndrewP

+0

Klingt ein bisschen ab. Der Broker gibt niemals dieselbe Nachricht mehr als an einen konkurrierenden Verbraucher, wenn LockDuration nicht abgelaufen ist. Ich vermute, dass etwas anderes passiert. Gibt es eine Chance, dass du eine Repro auf GitHub oder BitBucket teilst? –

Antwort

7

Ich vermute, was passiert ist folgendes: Maximum DurationLock kann 5 Minuten dauern. Wenn die Verarbeitung der Nachricht unter 5 Minuten erfolgt, wird die Nachricht als abgeschlossen markiert und vom Broker entfernt. Andernfalls wird die Nachricht erneut angezeigt, wenn die Verarbeitung länger als 5 Minuten dauert (wir haben die Sperre für die Nachricht verloren) und erneut verbraucht. Sie können dies überprüfen, indem Sie auf die DeliveryCount Ihrer Nachricht schauen.

Um dies zu beheben, können Sie die Nachrichtensperre kurz vor dem Ablaufen der Nachricht unter Verwendung von BrokeredMessage.RenewLockAsync() erneuern.

+0

Ich werde diese Methode auschecken, und wird in der Lieferzählung und Dauer Sperre suchen. Merkwürdiges Ding ist, dass es nicht jedes Mal geschieht, und dort scheint nicht viel Konsistenz darüber zu sein, wenn es geschieht, und auch, dass es scheint, dieselbe Nachricht zweimal sofort zu verarbeiten. Aber danke, dass du auf diese Funktion hingewiesen hast! – AndrewP

+0

@AndrewP Es könnte auch eine automatische Wiederholung auftreten, wenn Ihr Job eine nicht behandelte Ausnahme auslöst und Sie in der Service-Bus-Konfiguration "AutocompleteMessage" true haben. Sie können dies testen, indem Sie einfach einen ex in Ihre Triggerfunktion werfen und dann eine Nachricht an das Thema senden - Sie sollten eine Nachrichtenerkennung bis zur maximalen Anzahl an Wiederholungen sehen. – JoeBrockhaus

+0

Wird die Sperre nicht standardmäßig automatisch erneuert? Nach 5 Minuten wird die Sperre automatisch erneuert, wenn die Verarbeitung noch läuft. Oder fehlt mir etwas? – GETah