2016-10-17 9 views
9

Utworzyłem aplikację funkcji Azure z wyzwalaczem kolejki Azure Storage, która przetwarza kolejkę, w której każdy element kolejki jest adresem URL. Funkcja po prostu pobiera treść adresu URL. Mam inną funkcję, która ładuje i parsuje mapę witryny XML witryny i dodaje wszystkie adresy URL stron do kolejki. Problem polega na tym, że aplikacja Functions działa zbyt szybko i uderza w witrynę, więc zaczyna zwracać błędy serwera. Czy istnieje sposób ograniczenia/ograniczenia prędkości uruchamiania aplikacji Functions?Ograniczanie przetwarzania kolejki pamięci masowej Azure w aplikacji funkcji Azure

Mogę, oczywiście, napisać proste zadanie sieciowe, które przetwarza je seryjnie (lub z pewną asynchronizacją, ale ogranicza liczbę jednoczesnych żądań), ale bardzo podoba mi się prostota funkcji Azure i chciałem wypróbować "bez serwera" przetwarzanie danych.

Odpowiedz

15

Istnieje kilka opcji, które można rozważyć.

Po pierwsze, istnieje kilka pokręteł, które można skonfigurować w host.json, które kontrolują przetwarzanie kolejki (udokumentowane here). Pokrętło queues.batchSize określa liczbę pobranych wiadomości kolejki naraz. Jeśli ustawiono wartość 1, środowisko wykonawcze będzie pobierać 1 wiadomość naraz i będzie pobierać tylko następną, gdy przetwarzanie dla tej wiadomości zostanie zakończone. Może to spowodować pewien stopień serializacji na pojedynczym wystąpieniu .

Innym rozwiązaniem może być, aby ustawić NextVisibleTime na wiadomości, które enqueue w taki sposób, że są one rozmieszczone na zewnątrz - poprzez wiadomości domyślne, które są widoczne i stają skolejkowany gotowy do przetwarzania natychmiast.

Ostateczna opcja może polegać na tym, że możesz dodać kolejną wiadomość z kolekcją wszystkich adresów URL witryny zamiast pojedynczo, więc gdy wiadomość zostanie przetworzona, możesz przetworzyć adresy URL kolejno w swojej funkcji, i w ten sposób ograniczyć równoległość.

+2

Dzięki @ Mathewc. Poszedłem z twoją drugą propozycją (ustaw NextVisibleTime). Zajęło mi trochę czasu, aby dowiedzieć się, jak to się stało, ale działa dobrze. Mój kod jest na https://github.com/alindgren/SiteWarmer na wypadek, gdyby ktoś chciał rzucić okiem. – Alex

+0

Czy kolejka.batchSize liczba jednoczesnych wiadomości pobierania w kolejce? Lub po prostu na przykład tej funkcji? – Parker

+0

BatchSize to liczba wiadomości pobranych przy każdej iteracji pętli odpytywania kolejki. To znaczy. Jest to numer, który przekazujemy do wywołania usługi Azure Queues GetMessagesAsync. Ta pętla odpytywania jest specyficzna dla funkcji - każda funkcja kolejki ma własną. – mathewc

Powiązane problemy