

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 解决方案的工作原理
<a name="how-the-solution-works"></a>

 本节简要介绍 AWS 虚拟等候室工作流程中的步骤。[有关 GitHub为网站构建、自定义和集成等候室的详细信息，请参阅上的《开发者指南》](https://github.com/aws-solutions/aws-virtual-waiting-room/blob/main/docs/developer-guide.md)。

 等候室的公共 API 可以位于您的站点外围安全措施后面，也可以在未经任何授权的情况下使用。根据你使用哪种方法将等候室与网站集成，用户可能需要先向网站进行身份验证，然后才能导航到等候室并在队列中获得一席之地。

 客户端软件必须具有事件 ID 才能进入等候室并提出其他请求。事件 ID 是大多数针对公共和私人请求所必需的唯一 ID APIs。事件 ID 是在安装核心 API 堆栈期间设置的。在操作过程中，事件 ID 可以通过等候室页面作为 URL 参数或 Cookie 提供；它可以作为身份验证令牌声明的一部分提供，也可以通过不同的数据路径分发给客户端。

 在某些情况下，客户端需要事件 ID 和请求 ID 才能进行某些 API 调用。请求编号是等候室签发的唯一ID，代表排队的特定客户。

 以下步骤描述了进入队列、等待队列进度以及使用网站访问令牌退出等候室的 API 请求流程。

 **用户进入等候室：**

1.  用户将看到一个代表等候室入口点的屏幕或页面。他们选择进入队列，客户端软件（浏览器、移动设备、设备）调用`assign_queue_num`公共 API 来请求队列位置。

1.  API 请求会立即通过 API Gateway 传送到亚马逊 SQS 队列。

1.  当请求进入队列时，`assign_queue_num`API 调用就会返回。客户端会收到一个唯一的请求 ID，以后可用于检索队列位置、请求时间和访问令牌。

1.  `AssignQueueNum`Lambda 函数接收来自 SQS 队列的批量请求，最多包含十个请求。Lambda 服务分散调用以处理多批请求。

1.  `AssignQueueNum`Lambda 函数会批量验证每条消息，在 Elasticache (Redis OSS) 中增加队列计数器，并将每个请求及其关联的队列位置存储在 Elasticache (Redis OSS) 中。

1.  每封邮件在成功处理后即被删除。错误条件中涉及的消息将在以后的批次中重新处理一次。第二次失败后，它们会被发送到 dead-letter-queue已连接到[CloudWatch警报](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)的。

1.  客户端在收到来自调`assign_queue_num`用的请求 ID 后即可开始轮询 `queue_num` API。客户端向 `queue_num` API 发送事件 ID 和请求 ID，并收到数字队列位置或表示请求尚未处理的响应。在大型活动期间，客户可能需要多次拨打此电话。`GetQueueNum`Lambda 函数由 API Gateway 调用，并从 DynamoDB 返回客户端在队列中的数字位置。

**用户在等候室等候：**

1.  当客户端在队列中占据一席之地后，它就可以开始定期轮询 `serving_num` API 了。`serving_num`API 使用事件 ID 调用，并返回队列的当前服务位置。`serving_num`API 的响应告诉客户何时可以从等候室移动到可能发生最终交易的实际目标站点。L `GetServingNum` ambda 函数返回等候室的当前服务位置。

1.  当服务位置等于或大于客户端的队列（请求）位置时，客户端可以从公共 API 请求 JSON Web 令牌 (JWT)。该代币可以与目标网站一起使用以完成交易。使用事件 ID 和请求 ID 调用该 `generate_token` API。API Gateway 使用参数调用 Lam `GenerateToken` bda 函数。

1.  `GenerateToken`Lambda 函数验证请求并检查此令牌之前是否已生成。Lambda 函数在 DynamoDB 表中查询匹配的令牌。如果找到，则该令牌将返回给调用者，并且不会重新生成。此过程可防止使用单个请求 ID 生成具有新到期时间的多个不同令牌。

1.  如果在 DynamoDB 中找不到令牌，则 Lambda 函数会检索密钥以创建令牌，并将该令牌与事件 ID 和客户端的请求 ID 一起保存在 DynamoDB 中。Lambda 函数 EventBridge 向写入一个事件，表示已生成新令牌。Lambda 函数会增加一个 Elasticache (Redis OSS) 计数器，该计数器用于跟踪为该事件生成的代币数量。

1.  如果已启用，`queue_pos_expiry`则客户端可以通过调用 Lambda 函数`GetQueuePositionExpiryTime`的 `queue_pos_expiry` API 来查询其到期前的剩余时间。

 **用户离开等候室：**

1.  当客户端收到其令牌时，它会进入目标站点开始交易。根据您的基础设施如何支持与 JWT 集成，客户端可能需要以请求标头、Cookie 或其他方式呈现令牌。API Gateway 的授权方可用于验证客户端请求中包含的令牌。任何用于验证和管理的商业或开源库都 JWTs 可以在 AWS 代币上与虚拟等候室一起使用。如果令牌有效，则允许客户继续交易。

1.  客户端完成交易后，将调用私有 API 来更新客户端令牌的状态，并在 DynamoDB 中完成。

 **队列位置到期：**

1.  激活此功能后，与特定队列位置对应的请求 ID 只能在指定的时间间隔内生成令牌。

 **队列位置到期时增量发球计数器：**

1.  激活此功能后，服务计数器将根据无法生成代币的过期队列位置自动递增。