Azure Functions 方案

通常,构建对一系列关键事件做出反应的系统。 无论是构建 Web API、响应数据库更改还是处理事件流或消息,都可以使用 Azure Functions 来实现这些系统。

在许多情况下,函数与一系列云服务相集成,可提供功能丰富的实现。 以下列表显示了 Azure Functions 的常见(但绝不详尽)方案。

在文章顶部选择开发语言。

处理文件上传

可以通过多种方式使用函数来将文件处理到 blob 存储容器中或从 blob 存储容器传出。 若要详细了解在 blob 容器上触发的选项,请参阅最佳做法文档中的使用 blob

例如,在零售解决方案中,合作伙伴系统可以将产品目录信息作为文件提交到 blob 存储中。 上传文件时,可以使用 Blob 触发的函数验证、转换和处理文件到主系统中。

使用 Azure Functions 的文件上传过程示意图。

以下教程使用 blob 触发器(基于事件网格)处理 blob 容器中的文件:

例如,将 Blob 触发器与 Blob 容器上的事件订阅结合使用:

[FunctionName("ProcessCatalogData")]
public static async Task Run([BlobTrigger("catalog-uploads/{name}", Source = BlobTriggerSource.EventGrid, Connection = "<NAMED_STORAGE_CONNECTION>")] Stream myCatalogData, string name, ILogger log)
{
    log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myCatalogData.Length} Bytes");

    using (var reader = new StreamReader(myCatalogData))
    {
        var catalogEntry = await reader.ReadLineAsync();
        while(catalogEntry !=null)
        {
            // Process the catalog entry
            // ...

            catalogEntry = await reader.ReadLineAsync();
        }
    }
}

实时流和事件处理

云应用程序、IoT 设备和网络设备生成并收集大量遥测数据。 Azure Functions 可准实时地将这些数据作为热路径进行处理,然后将其存储在 Azure Cosmos DB 中,以供在分析仪表板中使用。

函数还可以使用事件网格等低延迟事件触发器以及 SignalR 等实时输出来准实时地处理数据。

使用 Azure Functions 的实时流进程示意图。

例如,可以使用事件中心触发器从事件中心读取事件,通过输出绑定在取消批处理和转换事件后写入事件中心。

[FunctionName("ProcessorFunction")]
public static async Task Run(
    [EventHubTrigger(
        "%Input_EH_Name%",
        Connection = "InputEventHubConnectionSetting",
        ConsumerGroup = "%Input_EH_ConsumerGroup%")] EventData[] inputMessages,
    [EventHub(
        "%Output_EH_Name%",
        Connection = "OutputEventHubConnectionSetting")] IAsyncCollector<SensorDataRecord> outputMessages,
    PartitionContext partitionContext,
    ILogger log)
{
    var debatcher = new Debatcher(log);
    var debatchedMessages = await debatcher.Debatch(inputMessages, partitionContext.PartitionId);

    var xformer = new Transformer(log);
    await xformer.Transform(debatchedMessages, partitionContext.PartitionId, outputMessages);
}

运行计划任务

借助 Functions,可以基于你定义的 cron 计划运行代码。

请参阅 在 Azure 门户中创建按计划运行的函数

例如,可以每隔 15 分钟分析一个金融服务客户数据库中的重复条目,以避免向同一客户发送多个通信。

计划任务的示意图,其中函数每隔 15 分钟清理一个数据库,并根据业务逻辑删除条目。

有关示例,请参阅以下代码片段:

[FunctionName("TimerTriggerCSharp")]
public static void Run([TimerTrigger("0 */15 * * * *")]TimerInfo myTimer, ILogger log)
{
    if (myTimer.IsPastDue)
    {
        log.LogInformation("Timer is running late!");
    }
    log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

    // Perform the database deduplication
}

生成可缩放的 Web API

HTTP 触发的函数可定义 HTTP 终结点。 这些终结点运行可以直接连接或通过使用绑定扩展连接到其他服务的函数代码。 可以将这些终结点组合到一个基于 Web 的 API 中。

还可以将 HTTP 触发的函数终结点用作 Webhook 集成,例如 GitHub Webhook。 通过这种方式,可以创建处理 GitHub 事件数据的函数。 有关详细信息,请参阅 将 Webhook 与 Azure Functions 配合使用来监视 GitHub 事件

使用 Azure Functions 处理 HTTP 请求的关系图。

有关示例,请参阅以下代码片段:

[FunctionName("InsertName")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequest req,
    [CosmosDB(
        databaseName: "my-database",
        collectionName: "my-container",
        ConnectionStringSetting = "CosmosDbConnectionString")]IAsyncCollector<dynamic> documentsOut,
    ILogger log)
{
    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    string name = data?.name;

    if (name == null)
    {
        return new BadRequestObjectResult("Please pass a name in the request body json");
    }

    // Add a JSON document to the output container.
    await documentsOut.AddAsync(new
    {
        // create a random ID
        id = System.Guid.NewGuid().ToString(), 
        name = name
    });

    return new OkResult();
}

构建无服务器工作流

函数通常充当无服务器工作流拓扑中的计算组件,例如逻辑应用工作流。 还可以使用 Durable Functions 扩展程序创建长时间运行的编排。 有关详细信息,请参阅 Durable Functions 概述

使用 Azure Functions 的一系列特定无服务器工作流的组合图。

响应数据库更改

某些进程需要在存储的数据更改时记录、审核或执行其他作。 函数触发器提供了一种很好的方式来获取数据更改通知以启动此类操作。

用于响应数据库更改的函数的关系图。

创建可靠消息系统

可以将 Functions 与 Azure 消息服务配合使用来创建高级事件驱动的消息解决方案。

例如,可以在 Azure 存储队列上使用触发器将一系列函数执行链接在一起。 或者对联机排序系统使用服务总线队列和触发器。

可靠消息系统中 Azure Functions 的示意图。

这些文章演示如何将输出写入存储队列:

这些文章演示如何从 Azure 服务总线队列或主题触发。

后续步骤