2016-02-15 23 views
9

當Webjobs通過QueueTrigger從Azure存儲上的隊列中獲取消息時,它會租用消息(使其不可見)。如果(webjob的)觸發功能花費很長時間來處理消息,這個租約是否自動擴展?或者我應該在功能中處理?Webjobs是否會自動續訂Azure隊列消息上的租約?

在這個環節Windows Azure Queues: Improved Leases, Progress Tracking, and Scheduling of Future Work,作者指出,「上的消息租約可以通過做原始出隊的工人進行擴展,以便它可以繼續處理消息

注:我嘗試了一個webjob(帶有QueueTrigger),等待20分鐘。

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

它成功完成。在此期間,沒有其他webjob實例嘗試嘗試相同的隊列項目(它並未變得可見)。因此,似乎存在租賃的自動更新機制。無論如何,我正在等待微軟員工或官方鏈接(msdn,azure,...)的答案。

回答

10

是的,您的租約自動延長。每次10分鐘。

請參閱此處[1]微軟員工提及azure.microsoft.com上的文檔和註釋[2]。

EDIT(長回答)

此外,源代碼的檢查,與QueueListener類在https://github.com/Azure/azure-webjobs-sdk/blob/cfc875a7f00e595410c0603e6ca65537025490a9/src/Microsoft.Azure.WebJobs.Host/Queues/Listeners/QueueListener.cs開始指示相同的。

QueueListener的代碼對線138,其中該10分鐘visibilityTimeout變量被定義的相關部分:

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

即變量然後沿着到ProcessMessageAsync,開始在該方法中CreateUpdateMessageVisibilityTimer限定的計時器傳遞具有相同的價值。 10分鐘值用於確定何時第一次和下一次更新可見性超時(通過將其減半並創建LinearSpeedupStrategy類的實例)。

最終,在類UpdateQueueMessageVisibilityCommand [3]中,您會發現隊列中的UpdateMessageAsync方法被調用,並使用相同的10分鐘更新。

LinearSpeedupStrategy將在5分鐘後再次更新,除非續訂失敗,在這種情況下,1分鐘後將再次嘗試(如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

該問題的答案之一屬於我。這意味着我看到了這個問題,顯然是另一個答案。而且我也閱讀了很久以前給出的鏈接並做了這個例子。我找不到那些暗示「你的租約自動延期,每次10分鐘」的內容。也許我想念一些東西。你能指定你得出這個結果的段落嗎? –

+1

@NuriTasdemir對不起,我沒有看海報的名字。你是對的,文章沒有提到時間的延長和時間。所以,我查看了GitHub上的源代碼(https://github.com/Azure/azure-webjobs-sdk/blob/master/src/Microsoft.Azure.WebJobs.Host/Queues/Listeners/QueueListener.cs)。 10分鐘的窗口在第138行被硬編碼。然後,這個值被傳遞給一些方法調用,並在250線上的計時器中再次使用,該計時器將更新消息以重置可見性超時。 – SvenAelterman

+1

@NuriTasdemir這有點複雜,因爲它會在中途開始重置可見性超時。所以,在處理時間的第一個5分鐘後,它會延長10分鐘等等。通過'LinearSpeedupStrategy'等,有'UpdateQueueMessageVisibilityCommand'的使用。但是底線是,代表WebJob的時間延長爲10每次分鐘。 – SvenAelterman

-2

您可以使用方法(Java代碼):

queue.retrieveMessage() 

從上Azure存儲隊列中得到的消息。默認30秒後將可見。

如果你想延長租期,您可以使用下面的代碼:

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

這意味着您的信息將能的60秒內進行處理。

+0

我konow這一點。但是,在我的情況下,我通過webjob sdk(c#)的QueueTrigger屬性獲取隊列消息,如「公共靜態異步任務ProcessQueueMessage([QueueTrigger(」queue_name「)] BlobInformation blobInfo)」。我猜在這種情況下,這是幕後處理。我只是要求確定。在我的試驗中,webjob進程花了長達90秒的時間,並且隊列消息在隊列中不可見。 –

+0

我認爲你可以閱讀文章[如何使用WebJobs SDK使用Azure隊列存儲](https://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk-storage-queues-如何對/#createQueue方法)。在webjob sdk中有一個「輪詢算法」。看來您的網絡工作將繼續進行,直到達到最長的等待時間。你能檢查你的消息最大等待時間? –

+0

@ AlexChen-WX該文章中描述的輪詢算法只涉及WebJob檢查新隊列消息的頻率。由於每張支票都會產生一次存儲交易,因此您可以使用它來控制成本。 – SvenAelterman