2

我有多个 Azure Functions,它们部署在不同的 Azure Function 插槽中。这些函数是基于 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 的函数。

4

3 回答 3

2

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

要添加,您应该将引用的所有代码替换为Storage Queue 输出绑定

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

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

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

于 2018-01-05T09:12:56.960 回答
1

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

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

然后,您可以使用结果将代码引导到正确的路径。

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

在此处输入图像描述

在本地运行时,您应该使用 Azure Functions Core Tools 进行调试。请参阅此链接。将您的示例应用设置放入 localsettings.json 以测试您的功能。适当地更改它们或使用多个文件来模拟您的插槽。

于 2018-01-05T08:52:39.180 回答
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)

“slot_queue_name”将在 Azure 函数槽应用程序设置中定义。

于 2018-01-06T10:06:28.550 回答