2016-02-15 18 views
9

Gdy Webjobs pobiera wiadomość z kolejki w magazynie Azure za pośrednictwem QueueTrigger, dzierżawi wiadomość (czyni ją niewidoczną). Jeśli funkcja wyzwalania (webjob) zajmuje dużo czasu na przetworzenie wiadomości, czy to dzierżawa jest automatycznie przedłużana? Czy powinienem sobie z tym poradzić w funkcji?Czy Webjobs automatycznie odnawia dzierżawy w wiadomościach kolejki Azure?

na ten link Windows Azure Queues: Improved Leases, Progress Tracking, and Scheduling of Future Work, autor stwierdza, że ​​„Leasing na komunikat może zostać przedłużony przez pracownika, który zrobił oryginalną rozkolejkowania tak, że może kontynuować przetwarzania komunikatu

Uwaga: mam próbował webjob (z QueueTrigger), który czeka 20 minut.

//Write Log 
Thread.Sleep(1200000); 
//Write Log 

Pomyślnie zakończono. I w tym czasie żadna inna instancja webjob nie próbuje wykonać tego samego elementu kolejki (nie stała się widoczna). Dlatego wydaje się, że istnieje mechanizm automatycznego odnawiania dzierżaw. W każdym razie czekam na odpowiedź od pracownika firmy Microsoft lub z oficjalnym linkiem (msdn, azure, ...).

Odpowiedz

10

Tak, dzierżawa jest automatycznie przedłużana. Za każdym razem jest to 10 minut.

Zobacz tę odpowiedź tutaj [1] przez pracownika firmy Microsoft, odnosząc się do dokumentów i komentarzy na temat azure.microsoft.com [2].

EDIT (długie odpowiedzi)

Ponadto, badanie kodu źródłowego, wychodząc z klasy QueueListener w https://github.com/Azure/azure-webjobs-sdk/blob/cfc875a7f00e595410c0603e6ca65537025490a9/src/Microsoft.Azure.WebJobs.Host/Queues/Listeners/QueueListener.cs oznacza takie same.

Kod w QueueListener ma odpowiednie części na linii 138, w którym 10 minut visibilityTimeout zmiennej Definicja:

TimeSpan visibilityTimeout = TimeSpan.FromMinutes(10); // long enough to process the job 

Zmienna jest następnie przekazane do ProcessMessageAsync, który uruchamia stoper zdefiniowane w metodzie CreateUpdateMessageVisibilityTimer z tą samą wartością. Wartość 10-minutowa służy do określenia, kiedy pierwsza i następna aktualizacja limitu czasu widoczności również (poprzez zmniejszenie o połowę wartości i utworzenie instancji klasy LinearSpeedupStrategy).

Ostatecznie, w klasie UpdateQueueMessageVisibilityCommand [3], okaże się, że metoda UpdateMessageAsync w kolejce jest wywoływana z tym samym 10-minutowym odnawianiem.

Ponownie zostanie odnowiona po 5 minutach, chyba że odnowienie się nie powiodło, w takim przypadku spróbuje ponownie po upływie 1 minuty (jak zdefiniowano w QueueListener).

[1] Azure Storage Queue and multiple WebJobs instances: will QueueTrigger set the message lease time on triggered?

[2] https://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk-get-started/

[3] https://github.com/Azure/azure-webjobs-sdk/blob/cfc875a7f00e595410c0603e6ca65537025490a9/src/Microsoft.Azure.WebJobs.Host/Queues/Listeners/UpdateQueueMessageVisibilityCommand.cs

+0

Jedna z odpowiedzi w tym pytaniu należy do mnie. Co oznacza, że ​​widziałem to pytanie i oczywiście drugą odpowiedź. Przeczytałem również podany link i wykonałem ten przykład dużo wcześniej. Nie znalazłem nic w sugestii, że "Twoja dzierżawa jest automatycznie przedłużana, za każdym razem 10 minut". Może tęsknię za czymś. Czy możesz określić akapit, w którym zawrzesz ten wynik? –

+1

@NuriTasdemir Przykro mi, nie patrzyłem na nazwy plakatów. Masz rację, artykuł nie wspomina o wydłużeniu czasu i czasie jego trwania. Spojrzałem więc na kod źródłowy w GitHub (https://github.com/Azure/azure-webjobs-sdk/blob/master/src/Microsoft.Azure.WebJobs.Host/Queues/Listeners/QueueListener.cs). 10-minutowe okno jest zakodowane na stałe w linii 138. Wartość ta jest następnie przekazywana podczas niektórych wywołań metod i ponownie używana w linii 250 w zegarze, która aktualizuje komunikat, aby zresetować limit czasu widoczności. – SvenAelterman

+1

@NuriTasdemir To trochę skomplikowane, ponieważ zacznie resetować limit czasu widoczności do połowy. Tak więc, po pierwszych 5 minutach przetwarzania, wydłuży go na 10 minut, itp. Używanie 'UpdateQueueMessageVisibilityCommand' przez' LinearSpeedupStrategy' itd. Ale najważniejsze jest to, że czas jest przedłużony w imieniu WebJob na 10 minut za każdym razem. – SvenAelterman

-2

Można użyć metody (kod Java):

queue.retrieveMessage() 

aby otrzymać wiadomość z kolejki na lazurowym przechowywania. Będzie domyślnie widoczny po 30 sekundach.

Jeśli chcą przedłużenia dzierżawy, można użyć kodu poniżej:

CloudQueueMessage updateMessage = queue.retrieveMessage(); 
EnumSet<MessageUpdateFields> updateFields = EnumSet.of(MessageUpdateFields.CONTENT, MessageUpdateFields.VISIBILITY); 
queue.updateMessage(updateMessage, 60, updateFields, null, null); 

Oznacza to wiadomość będzie mógł być przetwarzane przez kolejne 60 sekund.

+0

I konow tym. Jednak w moim przypadku otrzymuję komunikat kolejki przez atrybut QueueTrigger webjob sdk (C#) jak w "public static async Zadanie ProcessQueueMessage ([QueueTrigger (" nazwa_kolejki ")] BlobInformation blobInfo)". Chyba w tym przypadku jest to robione za kulisami. I pytam tylko, żeby się upewnić. W moich testach proces webjob trwał nawet 90 sekund, a komunikat kolejki nie był widoczny w kolejce. –

+0

Myślę, że można przeczytać artykuł [Jak korzystać z magazynu kolejki Azure za pomocą pakietu WebJobs SDK] (https://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk-storage-queues- how-to/# createqueue). W webjob sdk istnieje "algorytm sondowania". Wygląda na to, że twoje webjob będzie kontynuowane, dopóki nie osiągnie maksymalnego czasu oczekiwania. Czy możesz sprawdzić maksymalny czas oczekiwania wiadomości? –

+0

@ AlexChen-WX Algorytm sondowania opisany w tym artykule odnosi się tylko do tego, jak często WebJob będzie sprawdzać, czy nie pojawiły się nowe wiadomości kolejki. Ponieważ każda kontrola wiąże się z transakcją przechowywania danych, możesz jej użyć, aby kontrolować swoje koszty. – SvenAelterman

Powiązane problemy