Функция Azure-дросселирование запуска служебной шины


В настоящее время я оцениваю использование служебной Шины и функции azure для запуска некоторой работы, которую необходимо выполнить с помощью нисходящего вызова api. Все это довольно стандартно, за исключением того, что у меня нет хорошей обработки того, что происходит, когда нисходящая система перегружена и/или возвращает заголовки в дроссель (т. е. максимальное число вызовов в минуту/и т. д.). Мы, кажется, не имеем никакого динамического контроля над принудительным дросселированием триггера очереди.

Я знаю, что мы можем вручную установить max параллелизм но это не обязательно решает проблему в том, что у нас нет контроля над системой нисходящего потока и нужно учитывать, что она может быть отключена или замедлена в любое время.

Кроме того, мы можем создавать сообщения таким образом, чтобы они планировали поступать с определенной скоростью, но опять же нисходящая система все еще может насыщать или возвращать ограничения скорости.

Вариант 1:

Предполагая план потребления, с точки зрения решения это был один из способов, которым я мог думать из:

  • Queue1-полная скорость или максимальная скорость. Если мы начинаем получать ограничение скорости, установите значение кэша. Если задано значение кэша, то не обрабатывайте сообщение, а клонируйте его и поместите в queue2
  • Queue2-ниже на максимальное число параллелизма / предварительной выборки. Тот же процесс, что и выше, но толчок в queue3.
  • Queue3-наименьшее значение на максимальное число параллелизма / предварительной выборки. Мы просто медленно обрабатываем их.

В основном очередь 1 становится контроллером для queue2 и queue3, когда нисходящий поток система насыщена.

Вариант 2:

Мы можем клонировать сообщение и запрашивать его в будущем и продолжать делать это, пока все они не станут процессами. Сохраняет одну очередь и просто запрашивает, пока мы не обработаем ее.

Вариант 3:

Предполагая, что у нас есть свой собственный план приложения, который посвящен вместо потребления, я думаю, что мы можем Thread.Sleep функции, если они приближаются к ограничению скорости или вниз и продолжают повторять попытки. Это, вероятно, может быть ... расчет максимального параллелизма, экземпляров и ограничений скорости. Я бы не рассматривал это в плане потребления, поскольку спальные места могут резко увеличить расходы.

Я задаюсь вопросом, не упускаю ли я что-то простое в лучшем способе обработки нисходящего насыщения или дросселирования триггера очереди (может быть служебная шина или очередь хранения)

Править: Я хотел бы добавить, что я закачал 1 миллион сообщений в очередь служебной шины, которая была запланирована во время отправки. Я наблюдал за функцией лазури (план потребления) масштаб, чтобы ударить около 1500 в секунду, чтобы обеспечить хорошую метрику. Я еще не знаю, как будут действовать посвященные.

Похоже, что файл Хоста можно изменить на лету, и настройки вступают в силу немедленно. Хотя это для всех функций, которые могут работать в моем конкретном случае (обновляйте настройки и проверяйте каждую минуту или около того в зависимости от ограничения скорости).

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

2 2

2 ответа:

К сожалению, функции обратной связи, такие как то, что вам нужно, в настоящее время недоступны с триггером служебной Шины (и, в более общем плане, функциями Azure), поэтому вам придется справиться с этим самостоятельно.

Описанный подход будет работать, вам просто нужно будет обработать это в различных функциональных приложениях, поскольку настройки служебной шины применяются ко всему приложению, а не только к функции.

Может быть не очень большой помощью в вашем сценарии, но для приложений, обрабатывающих очередь 2 или 3, Вы можно также попробовать использовать флаг предварительного просмотра, который ограничивает число масштабируемых экземпляров вашего приложения: WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT. Обратите внимание, что это в предварительном просмотре, и пока нет никаких гарантий.

Я бы рекомендовал вам открыть выпуск по функциям repo, документирующим ваш сценарий. Такого рода проблемы, безусловно, то, что мы хотим решить, и чем больше обратной связи мы имеем, тем лучше.

Просто так, вы можете попросить своих подчиненных ребят предложить конечную точку очереди в дополнение к обычной конечной точке api? Затем вы можете заполнить их очередь, и они могут обрабатывать ее на досуге.