

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 解決方案的運作方式
<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 是針對公有和私有 APIs 的大多數請求所需的唯一 ID。事件 ID 是在核心 API 堆疊的安裝期間設定。在操作期間，事件 ID 可透過等待室頁面以 URL 參數或 Cookie 的形式提供；它可以作為身分驗證字符宣告的一部分提供，也可以透過不同的資料路徑分發給用戶端。

 在某些情況下，用戶端需要事件 ID 和請求 ID 才能進行特定 API 呼叫。請求 ID 是從等待室發出的唯一 ID，代表特定用戶端上線。

 下列步驟說明佇列項目的 API 請求流程、等待佇列進行，以及使用網站的存取權杖離開等待室。

 **使用者進入等待室： **

1.  使用者會看到代表等候室進入點的畫面或頁面。他們選擇輸入佇列，用戶端軟體 （瀏覽器、行動裝置、裝置） 會呼叫`assign_queue_num`公有 API 來請求佇列位置。

1.  API Gateway 會立即將 API 請求交付至 Amazon SQS 佇列。

1.  `assign_queue_num` API 呼叫會在請求放入佇列時傳回 。用戶端會收到唯一的請求 ID，稍後可用來擷取佇列位置、請求的時間和存取字符。

1.  `AssignQueueNum` Lambda 函數會從 SQS 佇列接收最多十個請求的批次。Lambda 服務風扇會發出呼叫，以處理多個批次的請求。

1.  `AssignQueueNum` Lambda 函數會驗證其批次中的每個訊息、將佇列計數器增加至 Elasticache (Redis OSS)，並將每個請求與其相關聯的佇列位置存放在 Elasticache (Redis OSS) 中。

1.  每個訊息都會在成功處理時刪除。涉及錯誤條件的訊息會在稍後的批次中重新處理一次。在第二次失敗後，它們會傳送至連線至 [CloudWatch 警示](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)的dead-letter-queue。

1.  用戶端在收到`assign_queue_num`來自呼叫的請求 ID 後，可以開始輪詢 `queue_num` API。用戶端會將事件 ID 和請求 ID 傳送至 `queue_num` API，並接收數值佇列位置或回應，指出請求尚未處理。在大型事件期間，用戶端可能需要進行此呼叫多次。API Gateway 會叫用 `GetQueueNum` Lambda 函數，並從 DynamoDB 傳回佇列中的用戶端數值位置。

** 使用者在等待室等待： **

1.  在用戶端在佇列中的位置之後，可以定期開始輪詢 `serving_num` API。`serving_num` API 會以事件 ID 呼叫，並傳回佇列目前的服務位置。`serving_num` API 的回應會告知用戶端何時可以從等待室移至最終交易的實際目標網站。`GetServingNum` Lambda 函數會傳回等待室目前的服務位置。

1.  當服務位置等於或大於用戶端的佇列 （請求） 位置時，用戶端可以從公有 API 請求 JSON Web Token (JWT)。權杖可與目標網站搭配使用，以完成交易。`generate_token` API 會以事件 ID 和請求 ID 呼叫。API Gateway 會使用 參數叫用 `GenerateToken` Lambda 函數。

1.  `GenerateToken` Lambda 函數會驗證請求，並檢查先前是否已產生此字符。Lambda 函數會查詢 DynamoDB 資料表，以取得相符的字符。如果找到，該字符會傳回給發起人，而且不會重新產生。此程序可防止單一請求 ID 用於產生具有新過期時間的多個不同字符。

1.  如果在 DynamoDB 中找不到字符，Lambda 函數會擷取金鑰以建立字符，並使用事件 ID 和用戶端的請求 ID 將字符儲存在 DynamoDB 中。Lambda 函數會將事件寫入 EventBridge，以表示已產生新的字符。Lambda 函數會遞增 Elasticache (Redis OSS) 計數器，以追蹤為事件產生的字符數量。

1.  如果 `queue_pos_expiry`已開啟，用戶端可以透過呼叫叫用 `GetQueuePositionExpiryTime` Lambda 函數的 `queue_pos_expiry` API 來查詢其到期前的剩餘時間。

 **使用者離開等候室： **

1.  當用戶端收到其字符時，它會進入目標網站以開始其交易。根據您的基礎設施支援與 JWT 整合的方式，用戶端可能需要在請求標頭、Cookie 或其他方式中呈現字符。API Gateway 的授權方可用來驗證用戶端請求中包含的字符。用於驗證和管理 JWTs的任何商業或開放原始碼程式庫，都可以與 AWS 字符上的虛擬等待室搭配使用。如果字符有效，則允許用戶端繼續其交易。

1.  用戶端完成交易後，會呼叫私有 API 來更新用戶端字符的狀態，並在 DynamoDB 中完成。

 **佇列位置過期： **

1.  啟用此功能時，對應至特定佇列位置的請求 ID 才有資格在指定的時間間隔內產生字符。

 **佇列位置過期時遞增服務計數器： **

1.  啟用此功能時，服務計數器會根據無法產生字符的過期佇列位置自動遞增。