2017-09-27 65 views
1

我有一個調用虛擬機上託管的Web服務的Azure函數。由於這種依賴關係,Azure功能最多不得超過8個實例同時運行(虛擬機只有8個內核,並且每個Web服務調用使用一個內核)。如果產生8個以上的實例,則Web服務調用將開始備份,觸發Azure功能的隊列中的項目將開始超時,並且消息將被丟棄。不過,我也希望儘可能多地利用可用資源來最大限度地處理隊列,所以我希望總是有8個Azure函數在隊列中有8個或更多項時運行。Azure函數host.json Queue batchSize小於newBatchThreshold

爲了達到所要求的限制,我設置了Azure的功能,計劃在一個應用程序服務的計劃,而不是一個消費計劃運行,我在host.json爲Azure的功能服務中設置以下值:

{ 
    "queues": { 
     "batchSize": 1, 
     "newBatchThreshold": 7 
    } 
} 

理論上這樣做只要7個或更少的函數實例正在運行,那麼將有1個更多的消息出隊,直到有8個消息被處理。我現在有這個運行,它似乎正在工作,但我找不到host.json文檔或WebJobs SDK documentation中的任何地方,它說明batchSize是否可以小於newBatchThreshold。我只知道newBatchThreshold的建議是batchSize的一半(這顯然不是我所做的)。

我的問題是:這個配置好嗎?還是有更好的方法來完成我的節流目標?

回答

4

是的,那完全沒問題。每個標誌都有一個精確的(儘管是一種令人困惑的)語義,任何組合都是有效的,並且會遵守記錄的語義。

請注意,使用消費Azure函數時,最終可能會縮放到多個實例,每個實例都有這些限制。如果你想避免嘗試設置WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT到1,根據https://github.com/Azure/azure-webjobs-sdk-script/wiki/Configuration-Settings

+0

感謝您的確認。我知道,通過消費Azure功能,它最終可以擴展到多個實例,每個實例都有自己的限制。這就是爲什麼我選擇使用應用服務計劃的原因,因此它僅限於一個實例。但是我不知道'WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT'配置設置,所以謝謝你的提示! – sam2929

+0

@DavidEbbo'batchSize'確實讓我感到困惑。我認爲這是每個實例最大並行執行的上限,因此對於值1,我不希望任何並行實例正在運行。我認爲'newBatchThreshold'會觸發預取,而不是立即運行。我想我把它與Service Bus搞混了。 – Mikhail

+0

@Mikhail是的,它是超級混亂。只要當前正在執行的計數小於閾值,它就會不斷抓取新的批次 –