你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Web-Queue-Worker 架构样式

此体系结构的核心组件是一个 Web 前端 ,用于处理客户端请求和执行资源密集型任务、长时间运行的工作流或批处理作业 的工作器 。 Web 前端通过 消息队列与工作线程通信。

显示 Web-Queue-Worker 体系结构的逻辑关系图。

以下组件通常合并到此体系结构中:

  • 一个或多个数据库

  • 用于存储数据库中的值的缓存,用于快速读取

  • 用于提供静态内容的内容分发网络

  • 非Microsoft服务提供商通常提供的电子邮件或短信服务(SMS)等远程服务

  • 用于身份验证的标识提供者

Web 和工作器都是无状态的,会话状态可以存储在分布式缓存中。 工作线程异步处理长时间运行的任务。 队列上的消息可以启动工作进程,或者由计划任务执行它以进行批处理。 如果应用程序没有长时间运行的操作,则工作线程是可选的。

前端可能包括 Web API。 单页应用程序可以通过调用 AJAX 来使用 Web API,或者本机客户端应用程序可以直接使用它。

何时使用此体系结构

Web-Queue-Worker 体系结构通常通过使用 Azure 应用服务或 Azure Kubernetes 服务等托管计算服务来实现。

对于以下用例,请考虑此体系结构:

  • 具有相对简单域的应用程序

  • 运行时间较长的工作流或批处理操作的应用程序

  • 首选托管服务而不是基础结构即服务(IaaS)的方案

优点

  • 简单易懂的体系结构

  • 以最少工作量部署和管理

  • 明确职责分离

  • 通过异步消息传送分离前端和工作程序

  • 前端和工作节点的独立扩展

挑战

  • 如果不仔细设计,前端和工作程序可能会成为难以维护和更新的单体组件。

  • 如果前端和辅助角色共享数据架构或代码模块,则可能存在隐藏的依赖项。

  • 网页前端在数据持久化到数据库后可能会出现故障,但在将消息发送到队列之前,这会导致数据一致性问题,因为工作进程未能执行其逻辑部分。 若要缓解此问题,可以使用 事务发件箱模式等技术,这些技术要求将传出消息首先回传到独立的队列中。 NServiceBus 事务会话库支持此技术。

最佳做法

应用服务中的Web队列工作者

本部分介绍推荐的 Web-Queue-Worker 架构,该架构使用 App Service。

显示 Web-Queue-Worker 体系结构的关系图。

下载此体系结构的 Visio 文件

Workflow

  • 前端实现为 App Service web 应用,工作角色实现为 Azure Functions 应用。 Web 应用和 Functions 应用都与提供虚拟机(VM)实例的应用服务计划相关联。

  • 可以将 Azure 服务总线Azure 存储队列 用于消息队列。 上图使用存储队列。

  • Azure 托管 Redis 存储会话状态和其他需要低延迟访问的数据。

  • Azure 内容分发网络 用于缓存静态内容,如图像、CSS 或 HTML。

  • 对于存储,请选择最适合应用程序需求的技术。 此方法称为多语言持久性,它使用同一系统中的多种存储技术来满足不同的需求。 为了说明这一想法,该图显示了 Azure SQL 数据库Azure Cosmos DB

有关详细信息,请参阅基线高度可用的区域冗余 Web 应用程序和使用 NServiceBus 和服务总线生成消息驱动的业务应用程序

其他注意事项

  • 并非每个交易都必须经过队列和工作者以写入存储。 Web 前端可以直接执行简单的读取和写入作。 工作进程专为资源密集型任务或长时间运行的工作流而设计。 在某些情况下,可能根本不需要辅助角色。

  • 使用计算平台的内置自动缩放功能横向扩展实例数。 如果应用程序的负载遵循可预测的模式,请使用基于计划的自动缩放。 如果负载不可预知,请使用基于指标的自动缩放。

  • 请考虑将 Web 应用和 Functions 应用放入单独的应用服务计划中,以便它们可以独立缩放。

  • 使用单独的应用服务计划进行生产和测试。

  • 使用部署槽位管理部署。 此方法允许将更新的版本部署到过渡槽,然后交换到新版本。 它还允许在更新过程中出现问题时交换回以前的版本。