2017-04-18 40 views
0

我有一個具有EventHub觸發器和消費計劃的Azure函數。在我的測試中,我將3000個事件用於幾個批次的事件中心。由於3000個事件的時間幾乎比300個事件的時間大10倍,所以我懷疑這個Azure功能沒有擴展到多個虛擬機/實例。Azure函數EventHub觸發器縮放作業函數實例

爲了驗證這個假設,我使用了一個Guid靜態變量,我初始化了一次並記錄在函數的每次運行中。所有3000次運行都記錄了相同的Guid。

即是即使我指定host.json以下配置: 「eventHub」:{ 「maxBatchSize」:1, 「prefetchCount」:10 }

邏輯的是,這會限制的並行處理在單個實例中,因此會啓動多個實例,但同樣只有1個Guid被記錄。

請注意,這不是App Service中唯一的功能。這可能是問題嗎?需要滿足什麼條件才能在多個虛擬機上啓動功能?

編輯: 我有32個分區和20個可以通過單元。第一個問題是我使用SendBatchAsync,它不分區事件。即使SendAsync沒有帶來任何規模,就像它沒有分區一樣。因此,我創建了分區的eventhub發件人,並在客戶端應用程序中發送事件時進行了循環分區。

AzureFunction處理的事件數量增加,但仍未創建超過1個虛擬機。此外,每秒處理的事件數量在開始時(每個時刻約200個)要大得多,在2000個事件之後或接近結束時,它們降至〜5。這與系統負載無關,因爲在9000次事件中觀察到同樣的行爲,在〜5k事件之後發生減速。

此Azure功能持續50-250毫秒,具體取決於負載。 它還通過Azure存儲隊列觸發器將事件發送到另一個Azure功能。有趣的是,由隊列觸發器觸發的這個函數不會擴展到1個以上的虛擬機,並且在eventhub緩慢觸發天藍色函數之前,它在開始時隊列中有1k條消息。在host.json隊列設置爲 「隊列」:{ 「maxPollingInterval」:2000, 「visibilityTimeout」: 「00:00:10」, 「BATCHSIZE」:32, 「maxDequeueCount」:5, 「newBatchThreshold」 :1 }

謝謝。

+0

這些事件分佈在多少個分區? – Mikhail

+0

事件中心有32個分區。我開始使用分區的eventhub發送器,並且性能稍微好一些,但仍然只使用了1個虛擬機。 – Vukasin

回答

1

這取決於幾個因素:

  • 您的活動中心已經和是否你正在寫的事件正在整個你的分區分佈式分區的數量。 Azure函數使用Event Processor Host來處理您的工作負載,您可以在此模式下獲得的最大規模是每個分區一個VM。
  • 您正在執行的每個事件工作負載。例如,如果您的功能除了記錄之外什麼也不做,那麼可以在單個虛擬機上在不到5秒內處理這些3000個事件。這不會保證將您的應用程序擴展到多個實例。

但是如果你正在寫一個批處理跨越幾個分區的事件這需要幾分鐘的總處理和你沒有看到你的吞吐量加速爲您的功能可擴展至那麼這可能表明有什麼不工作正確並且需要進一步調查。

+0

我有32個分區。第一個問題是我使用SendBatchAsync,它不分區事件。即使SendAsync沒有帶來任何規模,就像它沒有分區一樣。因此,我創建了分區的eventhub發件人,並在客戶端應用程序中發送事件時進行了循環分區。 – Vukasin

+0

我已經編輯了更多信息的問題。感謝你的回答。 – Vukasin

+1

加上Paul的評論,每個Function實例都由1個EventProcessorHost(EPH)支持。 EventHub只允許1個EPH在分區上保留租約,但是可以爲1個分區分配一個EPH。開始時,您有1個函數實例=> 1個EPH(EPH0)。 EventHub檢測到EPH0正在嘗試連接到它並將所有32個分區分配給它。如果EPH0能夠在縮放邏輯開始之前處理所有事件,那麼您將只需要1個函數實例。有關詳細信息,請參閱http://stackoverflow.com/questions/42901284/azure-functions-event-hub-trigger-bindings/42911842#42911842 –