Drosselung Azure Storage Queue-Verarbeitung in der Azure-Funktion-App
Habe ich erstellt ein Azure-Funktion app mit Azure Storage Queue, trigger, verarbeitet eine queue, in die jedes queue-Element eine URL. Die Funktion lädt den Inhalt der URL. Ich habe eine andere Funktion, die geladen und analysiert Website-XML-Sitemap und fügt alle Seiten-URLs in die Warteschlange. Das problem ist, dass ich die Funktionen, die app läuft zu schnell und es hämmert die website, so dass es beginnt, Rückkehr Server-Fehler. Gibt es eine Möglichkeit, um zu beschränken/throttle die Geschwindigkeit, mit der Funktionen-app läuft?
Konnte ich, natürlich, schreiben Sie einfachen web-job, die Sie verarbeitet Seriell (oder mit etwas async aber begrenzen die Anzahl der gleichzeitigen Anfragen), aber ich mag die Einfachheit von Azure-Funktionen und wollte versuchen, aus "serverless" - computing.
InformationsquelleAutor Alex | 2016-10-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar Optionen, die Sie betrachten können.
Zuerst, gibt es einige Knöpfe, die Sie konfigurieren können, in
host.json
Steuern queue-Verarbeitung (dokumentiert hier). Diequeues.batchSize
- regler ist, wie viele queue-Nachrichten abgerufen werden gleichzeitig. Wenn auf 1 gesetzt, die Laufzeit würde das abrufen 1 Nachricht in einer Zeit, und nur Holen den nächsten, wenn die Verarbeitung für die Nachricht abgeschlossen ist. Dies könnte Ihnen einige Ebene der Serialisierung auf eine einzige Instanz.Andere option könnte sein, für Sie, um den NextVisibleTime auf die Nachrichten, die Sie mit enqueue in einer Weise, dass Sie verteilt werden - standardmäßig werden Nachrichten in die Warteschlange eingereiht werden sichtbar und bereit für die Verarbeitung sofort.
Letzte option könnte sein, für Sie das einreihen einer Nachricht mit der Auflistung aller URLs für eine Website, sondern als ein zu einer Zeit, also wenn die Nachricht verarbeitet wird, können Sie die URLs nacheinander in Ihrer Funktion, wodurch die Parallelität Weg.
Ist Warteschlangen.batchSize die Anzahl der queue-Nachrichten holt auf einmal total? Oder einfach nur pro Instanz von dieser Funktion?
BatchSize ist die Anzahl der Nachrichten abgerufen, die bei jeder iteration unseres queue-polling-Schleife. I. e. es ist die Zahl, die wir passieren, um die Azure-Warteschlangen GetMessagesAsync nennen. Diese polling-Schleife ist speziell für eine Funktion - jedes queue-Funktion hat seine eigene.
vielen Dank für den code! große Hilfe!!
host.json-Dokumentation hat sich geändert, hier: docs.microsoft.com/en-us/azure/azure-functions/...
InformationsquelleAutor mathewc
NextVisibleTime können sich chaotisch, wenn es mehrere parallele Funktionen hinzufügen, um die Warteschlange. Eine weitere einfache option für alle mit diesem problem:
Erstellen Sie eine andere Warteschlange "gedrosselt-Elemente", und Ihre ursprüngliche Funktion Folgen es für die queue-Trigger. Dann, fügen Sie eine einfache timer-Funktion, bewegt Nachrichten aus dem ursprünglichen Warteschlange pro minute, Abstand der NextVisibleTime entsprechend.
InformationsquelleAutor vladhorby