如何基于功能槽调用Azure功能

时间:2018-01-05 06:40:47

标签: azure azure-functions azure-functions-runtime

我有多个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 Slot的函数。

3 个答案:

答案 0 :(得分:2)

正如@MurrayFoxcroft建议的那样,您应该使用每插槽应用设置来配置每个App Slot的存储帐户。

要添加,您应该使用Storage Queue output binding替换所引用的所有代码:

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

然后该函数将返回队列消息(您也可以使用params)。

StorageConnectionString应该是固定到App Slot的应用设置。

答案 1 :(得分:1)

您可以使用以下命令确定您的功能是否在插槽中运行:

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

然后,您可以使用结果将代码指向正确的路径。

但是,在可能的情况下,我会避免使用逻辑编码来处理基于插槽的不同场景。尝试尽可能地从配置中驱动逻辑。例如,在AppSettings中,您可以配置粘滞设置(插槽设置)以提供每个插槽的配置。

enter image description here

在本地运行时,您应该使用Azure Functions Core Tools进行调试。 See this link。将示例应用程序设置放在localsettings.json中以测试您的函数。适当更改它们或使用多个文件来模拟您的插槽。

答案 2 :(得分:0)

我通过根据插槽

创建队列名称来获得解决方案

因此,在我的控制台应用程序中,队列名称基于我要调用的插槽并添加到配置文件中。

    // 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)

将在Azure功能插槽应用程序设置中定义“slot_queue_name”。