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.
Wie lauten DeliveryCount und LockDuration in der Warteschlange? –
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
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? –