У меня есть функция Azure с триггером EventHub с планом потребления. В моем тесте я снимал 3000 событий в концентратор событий, используя несколько партий. Поскольку время для этих 3000 событий было почти в 10 раз больше, чем время для 300 событий, я подозревал, что эта функция Azure не масштабируется на несколько виртуальных машин / экземпляров.
Чтобы проверить эту гипотезу, я использовал статическую переменную Guid, которую я инициализировал один раз и регистрировал при каждом запуске функции. Все 3000 запусков регистрировались одним и тем же Guid.
Это происходит, даже если я укажу следующую конфигурацию в host.json: "eventHub": {"maxBatchSize": 1, "prefetchCount": 10}
Логика заключалась в том, что это ограничит параллельную обработку в пределах одного экземпляра, и из-за этого будет запущено несколько экземпляров, но опять же, в журнал регистрируется только 1 Guid.
Отметим, что это не единственная функция в службе приложений. Может быть, в этом проблема? Какое условие необходимо выполнить, чтобы функция запускалась на нескольких виртуальных машинах?
Изменить: у меня 32 раздела и 20 единиц пропускной способности. Первая проблема заключалась в том, что я использовал SendBatchAsync, который не разделяет события. Даже SendAsync не принес никакого масштаба, как будто он не разбивал. Поэтому я создал разделенных отправителей концентраторов событий и выполнил циклическое разделение при отправке событий в клиентском приложении.
Это увеличило количество событий, обрабатываемых AzureFunction, но по-прежнему не создавало более 1 виртуальной машины. Кроме того, количество событий, обрабатываемых в секунду, было намного больше в начале (~ 200 в каждый момент), а после 2000 событий или ближе к концу они упали до ~ 5. Это не имеет ничего общего с загрузкой системы, так как такое же поведение наблюдалось с 9000 событий, где замедление происходило после ~ 5k событий.
Эта функция Azure длится 50–250 мс, в зависимости от нагрузки. Он также отправляет событие в другую функцию Azure через триггер очереди хранилища Azure. Интересно то, что ни одна функция, которая запускается триггером очереди, не масштабируется до более чем 1 виртуальной машины, и в начале она имеет ~ 1k сообщений в очереди, до того, как функция azure запускает медленную работу концентратора событий. Параметры очереди в host.json: "queues": {"maxPollingInterval": 2000, "visibilityTimeout": "00:00:10", "batchSize": 32, "maxDequeueCount": 5, "newBatchThreshold": 1}
Спасибо.