Статический код используется несколькими лазурными функциями?

Допустим, у меня есть function app, который содержит 5 azure functions. В visual studio у меня есть эти функции как классы, но они используют некоторые вспомогательные методы static (чтобы избежать дублирования кода). В этих вспомогательных методах у меня есть своего рода шкафчики, чтобы убедиться, что в каждой функции выполняется определенный порядок. Теперь мой вопрос: все эти 5 функций имеют одно и то же состояние этих вспомогательных статических методов? Или каждая функция работает в изолированном контексте? Я хочу, чтобы функции работали параллельно, поэтому я не хочу, чтобы они блокировались друг другом.

В моем случае лазурные функции не статичны, например:

 [FunctionName("Function1")]
 public async Task Run([BlobTrigger("sample/{name}", Connection = "ConnectinoString")] Stream myBlob, string name, ILogger logger)

person alaa_sayegh    schedule 01.07.2020    source источник


Ответы (2)


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

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

public static int AddTwoNumbers(int a, int b)
{ return a+b; }

Совершенно безопасно вызывать одновременно все ваши 5 функций. С другой стороны, если ваша вспомогательная функция выглядит так:

public static int TransferMoney(int amount)
{
    CallBankAPI("wiretransfer", amount);
    return CallBankAPI("checkbalance");
}

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

public static int TransferMoney(int amount)
{
    lock(bankAPIlock) {
       CallBankAPI("wiretransfer", amount);
       return CallBankAPI("checkbalance");
    }
}

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

person Simon    schedule 01.07.2020

Когда вы работаете с функциями Azure, вы должны предполагать, что функции могут выполняться на разных серверах, поэтому статический класс не используется совместно. Но использование функций Azure — правильный выбор для параллельного выполнения операций. Я недостаточно знаю о вашем варианте использования, но вы можете попробовать разные подходы. Первый способ — это подключение каждой функции к следующей с помощью очередей (хранилище или служебная шина), объединение операций в цепочку в правильном порядке. Второй способ (возможно, лучший) — использовать устойчивые функции (https://docs.microsoft.com/it-it/azure/azure-functions/durable/durable-functions-overview?tabs=csharp).), которые позволяют управлять Поток выполнения по контексту экземпляра.

person Matteo Molino    schedule 01.07.2020