2017-03-21 57 views
0

我有一個MVC網站,一個存儲隊列和一個WebJob。用戶可以通過點擊網頁上的按鈕來請求生成一組報告。這會將消息插入到存儲隊列中。在過去,WebJob連續運行並正確處理這些請求。但報告的需求和規模已經擴大到WebJob放慢Web應用程序的速度。我仍然希望將請求消息放入隊列中,但延遲處理所有請求直到晚上,當時Web應用程序大部分空閒。這將允許我繼續使用WebJob代碼和QueueTrigger功能,而不必通過轉移到專用的工作人員角色等來浪費資源。報告不需要立即生成,因此延遲是可以接受的。Azure WebJob - 將處理時間限制在特定時間

我沒有看到內置的方式來設置處理時間窗口。我唯一發現的是一個用於啓動和停止WebJobs的PowerShell cmdlet(Start-AzureWebsiteJob/Stop-AzureWebsiteJob)。所以我在想,我可以創建一個計劃在午夜運行的powershell作業,啓動webjob,讓它運行,然後在AM早期再次運行並停止它。

有沒有人知道比這更好的選擇?任何更「官方」,也許我找不到?

回答

1

一個可能的解決方案是在插入隊列時將隊列中的消息隱藏一段時間。

如果使用AddMessage方法,則可以在initialVisibilityDelay參數中指定此時間範圍值。

這樣做的目的是確保消息不會立即顯示在隊列中以供WebJob選擇,並且只有在此時間間隔過後纔會顯示。

這樣的解決方案是否適合您?

+0

我完全忘記initialVisibilityDelay。我必須添加一個新的AddMessage包裝器,與我們現在使用的包裝器相比,但我認爲它會起作用。只要隊列沒有太大,以至於在一個晚上就不會被處理掉......因爲這個解決方案沒有「關閉」選項。謝謝。 –

1

也許我並沒有完全理解你的問題,但是你不能使用CRON時間表觸發的「Triggered」WebJob嗎?然後,你可以把它限制在特定的時間

0 * 20-22 * * * 

這個例子將從晚上8時,每分鐘運行到晚上10點

+0

也許我需要試驗。我完成了隊列觸發器作業和簡單的cron觸發作業,但從未試圖將兩者結合起來。當處理開始時,我不希望它僅僅嘗試在一個巨大的鏡頭中處理所有的隊列消息。這些報告很大,每個作業可以消耗相當數量的內存。出於這個原因,我將每個框的作業數量限制爲4個(使用MaxDequeueCount)。作爲一項被觸發的工作,我不確定這會起作用。如果隊列中有50條消息,我只想每次處理4條消息。 –