利用无服务器函数

小窍门

此内容摘自电子书《为 Azure 架构云原生 .NET 应用程序》,可在 .NET 文档 查阅或下载免费的 PDF 离线阅读。

Azure 平台的云原生 .NET 应用电子书封面缩略图。

在从管理物理计算机到利用云功能的范围内,无服务器处于极端的位置。 你唯一的责任是代码,并且仅在代码运行时付费。 Azure Functions 提供了将无服务器功能构建到云原生应用程序中的方法。

什么是无服务器?

无服务器是一种相对新的云计算服务模型。 这并不意味着服务器是可选的 - 代码仍在某个位置的服务器上运行。 区别在于,应用程序团队不再担心管理服务器基础结构。 相反,云供应商拥有此责任。 开发团队通过将业务解决方案交付给客户而不是管道来提高工作效率。

无服务器计算使用事件触发的无状态容器来托管服务。 它们可以根据需要横向扩展和横向缩减以满足需求。 Azure Functions 等无服务器平台与其他 Azure 服务(如队列、事件和存储)紧密集成。

无服务器解决了哪些挑战?

无服务器平台解决了许多耗时且成本高昂的问题:

  • 购买计算机和软件许可证
  • 安置、保护、配置和维护机器及其网络、电源和空调要求
  • 修补和升级操作系统和软件
  • 配置 Web 服务器或计算机服务以托管应用程序软件
  • 在其平台中配置应用程序软件

许多公司分配大量预算来支持硬件基础结构问题。 迁移到云有助于降低这些成本;将应用程序转移到无服务器可以帮助消除它们。

微服务和无服务器函数之间的区别是什么?

通常,微服务封装业务功能,例如在线电子商务网站的购物车。 它公开了多种操作,使用户能够管理他们的购物体验。 但是,函数是一个小的轻型代码块,用于执行单用途作以响应事件。 微服务通常构造为响应请求,通常来自接口。 请求可以是基于 HTTP Rest 的或基于 gRPC 的请求。 无服务器服务响应事件。 其事件驱动的体系结构非常适合用于处理短运行后台任务。

哪些场景适用于无服务器?

无服务器公开为响应触发器而调用的各个短时间运行的函数。 这使得它们非常适合用于处理后台任务。

应用程序可能需要在工作流中以步骤的形式发送电子邮件。 将消息详细信息置于队列中,而不是将通知作为微服务请求的一部分发送。 Azure 函数可以从队列中取出消息并异步发送电子邮件。 这样做可以提高微服务的性能和可伸缩性。 可以实现基于队列的负载调配,以避免与发送电子邮件相关的瓶颈。 此外,此独立服务还可以在许多不同的应用程序中重复使用为实用工具。

来自队列和主题的异步消息传送是触发无服务器函数的一种常见模式。 但是,Azure Functions 可由其他事件触发,例如对 Azure Blob 存储的更改。 支持图像上传的服务可以让 Azure 函数负责优化图像大小。 该函数可以直接通过插入 Azure Blob 存储来触发,简化微服务操作的复杂性。

许多服务在其工作流中具有长时间运行的进程。 这些任务通常作为用户与应用程序的交互的一部分完成。 这些任务可以强制用户等待,从而对他们的体验产生负面影响。 无服务器计算提供了一种在用户交互循环之外移动速度较慢的任务的好方法。 这些任务可以根据需求进行缩放,而无需整个应用程序进行缩放。

应在何时避免使用无服务器架构?

无服务器解决方案是按需预配和缩放的。 调用新实例时,冷启动是一个常见问题。 冷启动是预配此实例所用的时间。 通常,此延迟可能是几秒钟,但可能更长,具体取决于各种因素。 预配后,只要单个实例收到定期请求,单个实例就会保持活动状态。 但是,如果服务调用频率较低,Azure 可能会将其从内存中删除,并在重新调用时需要冷启动。 当函数横向扩展到新实例时,还需要冷启动。

图 3-9 显示了冷启动模式。 请注意,当应用程序处于冷状态时,需要执行额外的步骤。

冷启动与暖启动 图 3-9。 冷启动与热启动。

为了完全避免冷启动,可以从消耗计划转为专用计划。 还可以使用高级计划升级配置一个或多个 预热实例 。 在这些情况下,当需要添加另一个实例时,它已启动并准备就绪。 这些选项可以帮助缓解与无服务器计算相关的冷启动问题。

云提供商根据计算执行时间和消耗的内存为无服务器计费。 长时间运行的操作或高内存消耗工作负荷并非始终是无服务器的最佳候选项。 无服务器函数倾向于快速完成的小规模工作任务。 大多数无服务器平台都需要在几分钟内完成单个功能。 Azure Functions 默认有 5 分钟的超时持续时间,最多可以配置为 10 分钟。 Azure Functions 高级方案也可以缓解此问题,默认超时时间设置为 30 分钟,且可以配置为更高的无限制时间。 计算时间不是日历时间。 使用 Azure Durable Functions 框架 的更高级函数可能会在几天内暂停执行。 计费基于实际执行时间 - 当函数唤醒并恢复处理时。

最后,利用 Azure Functions 执行应用程序任务会增加复杂性。 最好先使用模块化、松散耦合的设计来构建应用程序。 然后,确定无服务器是否提供优势来证明额外复杂性的合理性。