Как вызвать функции Azure на основе функциональных слотов

У меня было несколько функций Azure, развернутых в разных слотах функций Azure. Функции вызываются на основе сообщения CloudStorage QueueMessage, как показано ниже.

// Get storage account
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(Microsoft.Azure.CloudConfigurationManager.GetSetting("StorageConnectionString"));
        // Next, create a queue client
        CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

        // Then retrieve a reference to a queue – here’s where you give your queue a name
        CloudQueue queue = queueClient.GetQueueReference(queueName);

        // Create the queue if it doesn’t already exist
        queue.CreateIfNotExists();

        // Penultimate step – create a message and add it to the queue.
        CloudQueueMessage message = new CloudQueueMessage(bordereauxId.ToString());

        // Finally, add your message to the queue
        queue.AddMessage(message);

        // Fetch the queue attributes.
        queue.FetchAttributes();

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


person Nilesh A    schedule 05.01.2018    source источник


Ответы (3)


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

Чтобы добавить, вы должны заменить весь цитируемый код на Привязка вывода очереди хранилища:

{
  "type": "queue",
  "direction": "out",
  "name": "$return",
  "queueName": "outqueue",
  "connection": "StorageConnectionString",
}

Затем функция просто вернет сообщение очереди (вы также можете использовать параметры out).

StorageConnectionString должен быть параметром приложения, закрепленным в слоте приложения.

person Mikhail Shilkov    schedule 05.01.2018

Вы можете определить, работает ли ваша функция в слоте, используя следующее:

var slot = System.Environment.GetEnvironmentVariable("APPSETTING_WEBSITE_SLOT_NAME", EnvironmentVariableTarget.Process);

Затем вы можете использовать результат, чтобы направить свой код по правильному пути.

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

введите здесь описание изображения

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

person Murray Foxcroft    schedule 05.01.2018
comment
Я запускаю функцию из консольного приложения, чтобы консольное приложение узнало, какая функция слота должна быть вызвана, поскольку имена всех функций одинаковы. Есть ли способ динамически изменять имя очереди в зависимости от слотов? - person Nilesh A; 05.01.2018
comment
Я добавил дополнительную информацию в конце своего ответа для вас. Идея @Michael об использовании выходной привязки также хороша, если вам не нужен детальный контроль над кодом вашего приложения. - person Murray Foxcroft; 05.01.2018

Я получил решение, сделав имя очереди на основе слотов

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

    // Then retrieve a reference to a queue – here’s where you give your queue a name
    CloudQueue queue = queueClient.GetQueueReference(queueName + "_" + slotname);

И имя очереди в функции определяется исходя из настроек приложения слота.

Следовательно, в методе функции Azure имя очереди будет определено, как показано ниже.

public static void Run([QueueTrigger("%slot_queue_name%", Connection = "AzureWebJobsStorage")]string myQueueItem)

Где «slot_queue_name» будет определено в настройках приложения слота функций Azure.

person Nilesh A    schedule 06.01.2018