2016-02-15 11 views
9

Quando Webjob riceve un messaggio da una coda su Archiviazione di Azure tramite QueueTrigger, affitta il messaggio (lo rende invisibile). Se la funzione di attivazione (di webjob) impiega molto tempo per elaborare il messaggio, questo lease viene automaticamente esteso? O dovrei gestirlo nella funzione?I Webjobs rinnovano automaticamente i lease sui messaggi di Azure Queue?

Su questo link Windows Azure Queues: Improved Leases, Progress Tracking, and Scheduling of Future Work, l'autore afferma che "un contratto di locazione il messaggio può essere esteso dal lavoratore che ha fatto il dequeue originale in modo che possa continuare l'elaborazione del messaggio"

Nota: ho provato un webjob (con un QueueTrigger) che aspetta 20 minuti.

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

È stato completato correttamente. E durante questo periodo nessuna altra istanza di webjob tenta di tentare lo stesso oggetto della coda (non è diventato visibile). Pertanto sembra che esista un meccanismo di rinnovo automatico per locazioni. Comunque sto aspettando una risposta da un dipendente Microsoft o con un link ufficiale (msdn, azzurro, ...).

risposta

10

Sì, il leasing viene automaticamente esteso. Sono 10 minuti ogni volta.

Vedere questa risposta qui [1] da un dipendente Microsoft che fa riferimento ai documenti e ai commenti su azure.microsoft.com [2].

EDIT (risposta lunga)

Inoltre, l'esame del codice sorgente, iniziando con la classe QueueListener al https://github.com/Azure/azure-webjobs-sdk/blob/cfc875a7f00e595410c0603e6ca65537025490a9/src/Microsoft.Azure.WebJobs.Host/Queues/Listeners/QueueListener.cs indica stessa.

Il codice QueueListener ha i componenti sulla linea 138, in cui viene definita la visibilityTimeout variabile 10 minuti:

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

Tale variabile viene quindi trasmesso al ProcessMessageAsync, che avvia un timer definito nel metodo CreateUpdateMessageVisibilityTimer con quello stesso valore. Il valore di 10 minuti viene utilizzato per determinare quando il primo e il successivo aggiornano anche il timeout di visibilità (dimezzandolo e creando un'istanza della classe LinearSpeedupStrategy).

Alla fine, nella classe UpdateQueueMessageVisibilityCommand [3], si scoprirà che il metodo UpdateMessageAsync in coda viene chiamato con lo stesso rinnovo di 10 minuti.

Il LinearSpeedupStrategy si rinnoverà di nuovo dopo 5 minuti, a meno che il rinnovo non sia andato a buon fine, nel qual caso riproverà dopo 1 minuto (come definito in 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

Una delle risposte in questa domanda mi appartiene. Il che significa che ho visto quella domanda e ovviamente l'altra risposta. E ho anche letto il link fornito e ho fatto questo esempio molto prima. Non sono riuscito a trovare nulla in quelli che suggerivano "il tuo leasing viene automaticamente esteso. Sono 10 minuti ogni volta". Forse mi manca qualcosa. Potresti specificare il paragrafo con cui concludi questo risultato? –

+1

@NuriTasdemir Mi dispiace, non ho guardato i nomi dei poster. Hai ragione, l'articolo non menziona l'estensione del tempo e quanto tempo è. Quindi, ho guardato il codice sorgente su GitHub (https://github.com/Azure/azure-webjobs-sdk/blob/master/src/Microsoft.Azure.WebJobs.Host/Queues/Listeners/QueueListener.cs). La finestra di 10 minuti è hardcoded sulla riga 138. Tale valore viene quindi passato lungo alcune chiamate di metodo e utilizzato nuovamente sulla riga 250 in un timer che aggiornerà il messaggio per reimpostare il timeout di visibilità. – SvenAelterman

+1

@NuriTasdemir È un po 'complicato perché inizierà a reimpostare il timeout di visibilità a metà. Quindi, dopo i primi 5 minuti di tempo di elaborazione, verrà esteso per 10 minuti, ecc. C'è l'uso di "UpdateQueueMessageVisibilityCommand' via' LinearSpeedupStrategy' ecc. Ma la linea di fondo è che il tempo è esteso per conto di WebJob per 10 minuti ogni volta. – SvenAelterman

-2

È possibile utilizzare il metodo (codice Java):

queue.retrieveMessage() 

per ottenere un messaggio da una coda per il magazzinaggio azzurro. Sarà visibile dopo 30 secondi per impostazione predefinita.

Se si desidera estendere il contratto di locazione, è possibile utilizzare il codice qui sotto:

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

Questo significa che il messaggio sarà in grado di essere trattati per altri 60 secondi.

+0

I Konow che. Tuttavia, nel mio caso ricevo il messaggio in coda tramite l'attributo QueueTrigger di webjob sdk (C#) come in "public static async Task ProcessQueueMessage ([QueueTrigger (" queue_name ")] BlobInformation blobInfo)". Immagino che in questo caso sia gestito dietro le quinte. E sto chiedendo solo per essere sicuro. Nelle mie prove, il processo webjob ha impiegato fino a 90 secondi e il messaggio della coda non è diventato visibile nella coda. –

+0

Penso che tu possa leggere l'articolo [Come utilizzare l'archiviazione della coda di Azure con l'SDK di WebJobs] (https://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk-storage-queues- how-to/# createQueue). C'è un "algoritmo di Polling" in sdk di webjob. Sembra che il tuo webjob continui a essere elaborato fino a quando non raggiunge il tempo di attesa massimo. Puoi controllare il tuo messaggio di tempo massimo di attesa? –

+0

@ AlexChen-WX L'algoritmo di polling descritto in quell'articolo si riferisce solo alla frequenza con cui WebJob controlla i nuovi messaggi in coda. Poiché ogni controllo comporta una transazione di archiviazione, è possibile utilizzarlo per tenere sotto controllo i costi. – SvenAelterman

Problemi correlati