Использование нескольких QueueTrigger Функций Azure для прослушивания одной и той же очереди хранилища

У меня есть QueueTrigger Функций Azure, который прослушивает в очереди хранилища такие сообщения:

Message text
--------------------------
{"ClientName": "client1"}
{"ClientName": "client2"}
{"ClientName": "client3"}

Тогда QueueTrigger имеет такой код:

if 'client1' == queue_msg['ClientName']:
    # do work required for client1
elif 'client2' == queue_msg['ClientName']:
    # do work required for client2
elif 'client3' == queue_msg['ClientName']:
    # do work required for client3

Я использую план потребления Linux с batchSize 1, потому что каждый вызов триггера очереди может занять около 5 минут, и я хочу убедиться, что не превышаю ограничения памяти. Это решение сейчас работает у меня хорошо, но меня беспокоит, что при увеличении количества клиентов сообщения начнут накапливаться в очереди. Можно ли просто создать новую функцию Azure, которая также прослушивает ту же очередь хранилища? Я думаю, это было бы нормально, потому что у каждого сообщения / клиента есть работа, которая не зависит от них, поэтому не имеет значения, получило ли какое-либо из приложений функций Azure первое сообщение. Это кажется мне наиболее экономически эффективным решением, но я хотел бы знать, есть ли лучшие альтернативы или какие-либо отрицательные результаты, о которых я не думаю.




Ответы (1)


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

=============================== Обновление =========== =====================

В соответствии с вашими требованиями каждый запущенный экземпляр может использовать до 1 ГБ памяти, я предлагаю вам использовать Premium-план для вашей функции.

Когда вы создаете функциональное приложение с премиум-планом, вы можете выбрать EP1, как показано на скриншоте ниже. План EP1 имеет максимум 3,5 ГБ памяти, поэтому его можно масштабировать до трех экземпляров при работе функции. введите описание изображения здесь

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

Если вы хотите, чтобы одновременно запускалось больше экземпляров, вы также можете выбрать премиум-план EP2 или EP3 для своего приложения-функции и изменить значение Максимальный пакет .

person Hury Shen    schedule 06.11.2020
comment
Причина, по которой я не хочу масштабироваться, заключается в том, что приложение может занять около 5 минут и может использовать до 1 ГБ памяти. Если у меня одновременно запущено несколько экземпляров, я получу сбои, потому что превышу лимит памяти 1,5 ГБ в плане потребления. Я установил batchSize на 1 и functionAppScaleLimit на 1, потому что я не хочу, чтобы приложение масштабировалось. Вот почему я думал, что создание еще одной функции Azure поможет обрабатывать сообщения. - person ddx; 06.11.2020
comment
Привет, @JohnT. Извините, я не знаю, что каждый экземпляр вашей функции может использовать до 1 ГБ памяти. Но у меня есть некоторые сомнения в том, что отказ вашей функции вызван множественным потреблением. Поскольку в документе показано максимальное память 1,5 ГБ для каждого экземпляра (не 1,5 ГБ для всех экземпляров). - person Hury Shen; 06.11.2020
comment
@JohnT Извините, я просматриваю документ, кажется, вся память 1,5 ГБ. Позже я изменю свое решение. - person Hury Shen; 06.11.2020
comment
Привет, @JohnT, пожалуйста, обратитесь к обновлению моего ответа. Я предлагаю вам использовать план Premium, и в обновлении этот план подробно описан. - person Hury Shen; 06.11.2020
comment
Спасибо @Hury Shen. Просто кажется, что создание дополнительной функции Azure в плане потребления было бы более рентабельным, чем переход на премиальный план. На данный момент у меня нет сбоев, я просто пытаюсь подготовиться к будущему - person ddx; 06.11.2020
comment
Привет, @JohnT План Premuim не будет стоить намного дороже, чем план потребления, потому что он также может масштабироваться. Когда он использует только 1 экземпляр или 0 экземпляров, это не будет стоить больших денег. - person Hury Shen; 06.11.2020
comment
@JohnT Если у вас нет других проблем с этим постом, не могли бы вы отметить мой ответ как принятый, заранее спасибо ~ - person Hury Shen; 06.11.2020
comment
просматривая страницу с ценами на функции Azure azure.microsoft.com/en-us / pricing / details / functions, похоже, тариф премиум-класса стоит значительно дороже, чем план потребления. Я не понимаю, почему вы думаете, что создание еще одной функции Azure с той же логикой QueueTrigger было бы неправильным. Возможны ли условия гонки? Может ли каждый QueueTrigger принимать два сообщения одновременно? Я думаю, что в моем первоначальном вопросе остались вопросы без ответа. - person ddx; 06.11.2020
comment
Привет, @ddx, я не сказал, что решение для создания еще одного триггера очереди функций Azure неверно. Я просто отвечаю вашему требованию I would like to know if there are better alternatives и предлагаю вам другое решение с функциональным хостом на премиальном плане, потому что это решение не требует создания двух функциональных приложений с одним и тем же кодом. Премиум-план действительно будет стоить дороже, чем потребление, но я имею в виду, что премиальный план предоставляет те же функции и механизм масштабирования, что и в плане потребления, что сэкономит нам деньги (он более рентабелен, чем другой план, такой как план обслуживания приложений). - person Hury Shen; 09.11.2020
comment
@ddx Что касается вашего вопроса о Can two messages be picked up at the same time by each QueueTrigger?, думаю, нам не стоит об этом беспокоиться. Когда функция получает одно сообщение из очереди, сообщение не будет получено другой функцией, потому что сообщение будет заблокировано (аналогично механизму блокировки базы данных). - person Hury Shen; 09.11.2020
comment
Спасибо за разъяснение @Hury Shen. Я думаю, что для моего варианта использования было бы более эффективным и экономичным создать еще одну функцию Azure с тем же кодом очереди в плане потребления. Премиум-план может быть хорошим решением временно, но я чувствую, что могу лучше контролировать масштабирование, создавая отдельные функции и отслеживая очередь. См. Этот вопрос для получения более подробной информации о моем конкретном варианте использования: stackoverflow.com/questions/64685629/ Я ценю вашу помощь в этом - person ddx; 09.11.2020
comment
если я перейду на премиальный план и установлю Maximum Burst на 3, мне нужно будет изменить batchSize на 3 или я могу оставить его на 1, и приложение будет автоматически масштабироваться до 3 одновременных экземпляров? - person ddx; 10.11.2020
comment
@ddx Я не думаю, что нам нужно менять batchSize с на 3. Вы можете обратиться к выражению в этой документ. - person Hury Shen; 11.11.2020
comment
Если я нахожусь в плане потребления Linux и устанавливаю functionAppScaleLimit на 2, а batchSize на 1, означает ли это, что два экземпляра могут работать одновременно? Или мне нужно быть на премиальном плане с Maximum Burst, установленным на 2, чтобы достичь этого? - person ddx; 11.11.2020
comment
Привет, @ddx, я проведу несколько тестов и дам ответ под новым постом. - person Hury Shen; 12.11.2020