閱讀英文

共用方式為

使用 Azure Cosmos DB 和 Azure Functions 的无服务器数据库计算

适用范围: NoSQL

无服务器计算涉及关注可重复和无状态的各部分逻辑的功能。 这些组件无需基础设施管理,并且只有在运行的秒数或毫秒数内才消耗资源。 无服务器计算移动的核心是函数,这些函数在 Azure 生态系统中通过 Azure Functions 使用。 若要了解 Azure 中的其他无服务器执行环境,请参阅 Azure 中的无服务器产品/服务页面。

通过 Azure Cosmos DB 和 Azure Functions 的本地集成,您可以直接在 Azure Cosmos DB 帐户中创建数据库触发器、输入绑定以及输出绑定。 使用 Azure Functions 和 Azure Cosmos DB,可以创建和部署事件驱动的无服务器应用,并低延迟地访问多区域用户群的丰富数据。

如果数据库客户端未正确管理,则 Azure Functions 可以为每个调用创建独立的数据库连接,这可能会影响高并发性下的连接性能,尤其是在消耗计划中。 但是,当使用 Cosmos DB 绑定或触发器时,Azure Functions 在内部重复使用共享的 Cosmos DB SDK 客户端,以确保在多个调用之间高效地进行连接池管理。 Azure Cosmos DB 支持基于 HTTP 的连接模式和基于 TCP 的连接模式。 此体系结构支持需要动态数据访问的可缩放高性能工作负荷。

概述

Azure Cosmos DB 和 Azure Functions 支持采用以下方式集成数据库和无服务器应用:

  • 为 Azure Cosmos DB 创建事件驱动的 Azure Functions 触发器。 此触发器依靠更改馈送流来监视 Azure Cosmos DB 容器的更改情况。 当对容器进行任何更改时,更改源流将发送到可调用 Azure Function 的触发器。
  • 或者,使用“输入绑定”将 Azure Function 绑定到 Azure Cosmos DB 容器。 执行某个函数时,输入绑定将从容器中读取函数。
  • 使用“输出绑定”将函数绑定到 Azure Cosmos DB 容器。 当函数执行完成时,输出绑定会将数据写入容器。

注意

目前,适用于 Azure Cosmos DB 的 Azure Functions 触发器、输入绑定和输出绑定仅支持与 API for NoSQL 一起使用。 对于所有其他的 Azure Cosmos DB API,您应该使用 API 的静态客户端,通过函数访问数据库。

下图介绍了所有这三种集成:

Azure Cosmos DB 和 Azure Functions 如何集成

适用于 Azure Cosmos DB 的 Azure Functions 触发器、输入绑定和输出绑定可在以下组合中使用:

  • 适用于 Azure Cosmos DB 的 Azure Functions 触发器可与其他 Azure Cosmos DB 容器的输出绑定一起使用。 函数在更改源中的某个项目上执行操作后,可以将其写入其他容器(将其写入其来源的同一容器将有效创建递归循环)。 或者,您可以使用适用于 Azure Cosmos DB 的 Azure Functions 触发器和输出绑定,将所有更改的项有效地从一个容器迁移到另一个容器。
  • Azure Cosmos DB 的输入绑定和输出绑定可在相同 Azure Function 中使用。 这非常适用于以下情况:使用输入绑定查找某些数据,在 Azure Function 中进行修改,并在修改后将其保存到相同容器或不同容器。
  • Azure Cosmos DB 容器的输入绑定可在适用于 Azure Cosmos DB 的 Azure Functions 触发器的相同函数中使用,并且无论是否与输出绑定一起使用都可正常运行。 可以使用此组合以将最新汇率信息(使用输入绑定提取到汇率容器)应用到购物车服务中新订单的更改源。 使用输出绑定可以将应用了当前货币兑换的更新购物车总额写入第三个容器中。

用例

下面的用例展示通过将数据连接到事件驱动的 Azure Functions,可充分利用 Azure Cosmos DB 数据的几种方法。

IoT 用例 - 适用于 Azure Cosmos DB 的 Azure Functions 触发器和输出绑定

在 IoT 实现中,当引擎检查灯显示在连接的汽车中时,可以调用一个函数。

实现:使用适用于 Azure Cosmos DB 的 Azure Functions 触发器和输出绑定

  1. 适用于 Azure Cosmos DB 的 Azure Functions 触发器用于触发与汽车警报相关的事件,例如引擎检查灯在连接的汽车上发光。
  2. 当引擎检查灯发光时,传感器数据将发送到 Azure Cosmos DB。
  3. Azure Cosmos DB 创建或更新新的传感器数据文档,然后这些更改将流式传输到适用于 Azure Cosmos DB 的 Azure Functions 触发器。
  4. 每当传感器数据集发生变更时,都会调用触发器,因为所有变更均通过变更流进行传输。
  5. 在函数中使用阈值条件以将传感器数据发送到保修部门。
  6. 如果温度也超过特定值,也会向所有者发送警报。
  7. 函数中的“输出绑定”更新其他 Azure Cosmos DB 容器中的汽车记录,以存储关于检查引擎事件的信息

下图显示在 Azure 门户中为此触发器编写的代码。

在 Azure 门户中创建适用于 Azure Cosmos DB 的 Azure Functions 触发器

财务用例 - 计时器触发器和输入绑定

在财务实现中,当银行帐户余额低于特定金额时,可以调用一个函数。

实现:使用 Azure Cosmos DB 输入绑定的计时器触发器

  1. 通过使用 计时器触发器,可以使用“输入绑定”每隔一定时间检索存储在 Azure Cosmos DB 容器中的银行帐户余额信息。
  2. 如果余额低于用户设置的低余额阈值,则采取 Azure Function 中的某个措施。
  3. 输出绑定可以是 SendGrid 集成,它可将电子邮件从服务帐户发送到为每个低余额帐户标识的电子邮件地址。

下图显示了 Azure 门户中适用于此方案的代码。

用于财务方案的计时器触发器的 Index.js 文件

用于财务方案的计时器触发器的 Run.csx 文件

游戏用例 - 适用于 Azure Cosmos DB 的 Azure Functions 触发器和输出绑定

在游戏中,创建新用户时,可以使用 Azure Cosmos DB for Gremlin 搜索可能知道新用户的其他用户。 然后,将结果写入 Azure Cosmos DB 或 SQL 数据库以便于检索。

实现:使用适用于 Azure Cosmos DB 的 Azure Functions 触发器和输出绑定

  1. 通过使用 Azure Cosmos DB 图形数据库存储所有用户,可以使用适用于 Azure Cosmos DB 的 Azure Functions 触发器创建新函数。
  2. 每当插入新用户时,都将调用该函数,然后使用“输出绑定” 存储结果。
  3. 该函数将查询图形数据库,以搜索与新用户直接相关的所有用户,并将该数据集返回到函数。
  4. 随后,此数据存储在 Azure Cosmos DB 中,任何前端应用程序都可以轻松检索这些数据,以便向新用户显示他们的关联好友。

零售用例 - 多个函数

在零售实现中,当用户向购物篮添加商品时,可以为可选业务管道组件灵活创建和调用函数。

实现:侦听一个容器的多个适用于 Azure Cosmos DB 的 Azure Functions 触发器

  1. 通过将适用于 Azure Cosmos DB 的 Azure Functions 触发器添加到每个函数可以创建多个 Azure Functions,它们全部都侦听购物车数据的同一更改源。 当多个函数侦听相同的更改源时,每个函数都需要一个新的租用集合。 有关租约集合的详细信息,请参阅了解更改源处理器库
  2. 每当新商品添加到用户的购物车时,更改源都将从购物车容器中独立调用每个函数。
    • 一个函数可能使用当前购物篮的内容更改用户可能有兴趣的其他商品的显示内容。

    • 另一个函数可能更新库存总数。

    • 另一个函数可能将某些产品的客户信息发送到营销部门,该部门会向他们发送促销邮件。

      任何部门通过侦听更改源都可以创建适用于 Azure Cosmos DB 的 Azure Functions 触发器,并可确保它们在此过程中不会延迟关键的订单处理事件。

在所有这些用例中,由于函数本身已分离应用,所以无需一直启动新应用实例。 相反,Azure Functions 会在需要时启动个别函数以完成离散进程。

工具

Azure Cosmos DB 和 Azure Functions 之间的原生集成在 Azure 门户和 Visual Studio 中可用。

为什么为无服务器计算选择 Azure Functions 集成?

Azure Functions 提供创建可扩展工作单元的功能,或者提供按需运行的简洁逻辑部分,无需预配或管理基础结构。 通过使用 Azure Functions,无需创建全面应用来响应 Azure Cosmos DB 数据库中的更改,即可为特定任务创建可重复使用的较小函数。 此外,还可以将 Azure Cosmos DB 数据用作 Azure Function 的输入或输出,以响应 HTTP 请求或定时触发器等事件。

出于以下原因,建议对无服务器计算体系结构使用 Azure Cosmos DB 数据库:

  • 即时访问所有数据:可以粒度访问每个存储的值,因为 Azure Cosmos DB 在默认情况下会自动建立所有数据的索引,并使这些索引立即可用。 这意味着能够不断地查询、更新和添加新项目到数据库,并通过 Azure Functions 进行即时访问。

  • 无架构。 Azure Cosmos DB 没有架构,因此只有它可以处理来自 Azure Function 的任何数据输出。 这种“处理任何事物”的方法可以轻松创建各种将输出导入 Azure Cosmos DB 的函数。

  • 可缩放的吞吐量。 在 Azure Cosmos DB 中,吞吐量可以立即增加和减少。 当容器中有数百或数千个函数在查询和写入数据时,可以增加RU/s来处理负载。 通过使用分配的 RU/s,所有函数都可并行运行,并且可保证数据一致

  • 多区域复制。 可以复制 中国各地的 Azure Cosmos DB 数据,以减少延迟,将数据定位到最靠近用户所在的位置。 对于全部 Azure Cosmos DB 查询,事件驱动的触发器的数据从最靠近用户的 Azure Cosmos DB 读取。

如果要寻求与 Azure Functions 集成以存储数据并且无需深层索引,或者如果需要存储附件和媒体文件,Azure Blob 存储触发器可能是一个更好的选择。

Azure Functions 的优点:

  • 事件驱动。 Azure Functions 受事件驱动,并且可以侦听 Azure Cosmos DB 的更改源。 这意味着无需创建侦听逻辑,只关注所侦听内容的更改即可。

  • 无限制。 函数并行执行,服务根据需要启动任意数量的函数。 设置参数。

  • 适用于快捷任务。 每当事件触发时,服务都会触发函数的新实例,并在函数完成后立即关闭它们。 只需支付函数运行时间的费用。

后续步骤

现在让我们真正连接 Azure Cosmos DB 和 Azure Functions: