Функции Azure Eventhub Масштабирование триггера ввода - PullRequest
0 голосов
/ 03 октября 2018

У нас есть EventHub со сроком хранения 1 день, содержащий миллионы сообщений.Чтобы использовать это, у нас есть функция Azure, которая читает из этого концентратора событий через привязку концентратора событий .Функция в основном читает необработанные байты, десериализует его в json, выполняет некоторые преобразования и выводит его в другой концентратор событий.

Он принимает EventData [] в качестве входных данных, чтобы позволить нам получить пакет EventData одновременно.Мы настроили его на получение 1024 сообщений в пакете.

Когда мы запускаем функцию, и ей необходимо повторно обработать последние 24 часа, она использует только 1 узел из 5 доступных в плане обслуживания приложения,как видно из метрики:

Avg CPU Percentage by instance

Согласно документам , масштабирование должно вести себя так:

Когда ваша функция впервые включена, существует только один экземпляр функции.Давайте назовем этот экземпляр функции Function_0.Function_0 имеет единственный экземпляр EventProcessorHost, который имеет аренду на все десять разделов.Этот экземпляр читает события из разделов 0-9.С этого момента происходит одно из следующих событий:

Новые экземпляры функций не нужны : Function_0 может обработать все 1000 событий, прежде чем включится логика масштабирования функций. В этом случаеFunction_0 обрабатывает все 1000 сообщений.

Добавлен дополнительный экземпляр функции : логика масштабирования функций определяет, что Function_0 имеет больше сообщений, чем может обработать.В этом случае создается новый экземпляр приложения функции (Function_1) вместе с новым экземпляром EventProcessorHost.Концентраторы событий обнаруживают, что новый экземпляр узла пытается прочитать сообщения.Концентрация событий концентратора балансирует разделы между экземплярами хоста.Например, разделы 0-4 могут быть назначены для Function_0, а разделы 5-9 - для Function_1.

Добавлено еще N экземпляров функций : логика масштабирования функций определяет, что функции Function_0 и Function_1 имеютбольше сообщений, чем они могут обработать.Создаются новые экземпляры приложения-функции Function_2 ... Functions_N, где N больше, чем количество разделов концентраторов событий.В нашем примере Event Hubs снова балансирует нагрузку на разделы, в данном случае на экземплярах Function_0 ... Functions_9.

Я полагаю, что мы выбираем вариант № 1, хотя у нас есть 24 часаданные в концентраторе событий только с одним узлом, обрабатывающим данные.При такой скорости обработки требуется много часов, а 4 узла простаивают.

Как функция Azure узнает, когда масштабироваться в этом сценарии, и можем ли мы повлиять на это поведение?

...