View a markdown version of this page

솔루션 작동 방식 - AWS의 가상 대기실

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

솔루션 작동 방식

이 섹션에서는 AWS 가상 대기실 워크플로의 단계를 상위 수준에서 설명합니다. 웹 사이트의 대기실 구축, 사용자 지정 및 통합에 대한 자세한 내용은 GitHub의 개발자 안내서를 참조하세요.

대기실의 퍼블릭 API는 사이트 경계 보안 뒤에 위치하거나 승인 없이 사용할 수 있습니다. 대기실을 웹 사이트와 통합하는 데 사용하는 접근 방식에 따라 사용자는 대기실로 이동하여 대기열의 위치를 얻기 전에 먼저 웹 사이트에 인증해야 할 수 있습니다.

대기실에 들어가서 다른 요청을 하려면 클라이언트 소프트웨어에 이벤트 ID가 있어야 합니다. 이벤트 ID는 퍼블릭 및 프라이빗 APIs. 이벤트 ID는 코어 API 스택을 설치하는 동안 설정됩니다. 작업 중에 이벤트 ID는 대기실 페이지를 통해 URL 파라미터 또는 쿠키로 제공할 수 있습니다. 인증 토큰 클레임의 일부로 제공하거나 다른 데이터 경로를 통해 클라이언트에 배포할 수 있습니다.

클라이언트가 특정 API를 호출하기 위해 이벤트 ID와 요청 ID가 모두 필요한 경우가 있습니다. 요청 ID는 대기실에서 발급된 고유 ID로, 특정 클라이언트를 일렬로 나타냅니다.

다음 단계에서는 대기열 항목에 대한 API 요청 흐름, 대기열 진행 대기, 웹 사이트의 액세스 토큰을 사용하여 대기실 종료를 설명합니다.

사용자가 대기실에 들어옵니다.

  1. 사용자에게 대기실 진입점을 나타내는 화면 또는 페이지가 표시됩니다. 대기열에 들어가도록 선택하고 클라이언트 소프트웨어(브라우저, 모바일, 디바이스)가 assign_queue_num 퍼블릭 API를 호출하여 대기열 위치를 요청합니다.

  2. API Gateway는 API 요청을 Amazon SQS 대기열로 즉시 전송합니다.

  3. 요청이 대기열에 배치되면 assign_queue_num API 호출이를 반환합니다. 클라이언트는 나중에 대기열 위치, 요청 시간 및 액세스 토큰을 검색하는 데 사용할 수 있는 고유한 요청 ID를 수신합니다.

  4. AssignQueueNum Lambda 함수는 SQS 대기열에서 최대 10개의 요청 배치를 수신합니다. Lambda 서비스는 호출을 팬아웃하여 여러 배치의 요청을 처리합니다.

  5. AssignQueueNum Lambda 함수는 배치의 각 메시지를 검증하고, Elasticache(Redis OSS)의 대기열 카운터를 늘리고, 연결된 대기열 위치와 함께 각 요청을 Elasticache(Redis OSS)에 저장합니다.

  6. 각 메시지는 성공적으로 처리되면 삭제됩니다. 오류 조건과 관련된 메시지는 이후 배치에서 한 번 재처리됩니다. 두 번째 실패 후 CloudWatch 경보에 연결된 dead-letter-queue로 전송됩니다.

  7. 클라이언트는 assign_queue_num 호출에서 요청 ID를 수신한 후 queue_num API 폴링을 시작할 수 있습니다. 클라이언트는 이벤트 ID와 요청 ID를 queue_num API로 전송하고 숫자 대기열 위치 또는 요청이 아직 처리되지 않았음을 나타내는 응답을 수신합니다. 클라이언트는 대규모 이벤트 중에이 호출을 두 번 이상 수행해야 할 수 있습니다. GetQueueNum Lambda 함수는 API Gateway에서 호출되며 DynamoDB에서 대기열의 클라이언트 숫자 위치를 반환합니다.

사용자가 대기실에서 대기합니다.

  1. 클라이언트가 대기열에 위치하면 정기적으로 serving_num API 폴링을 시작할 수 있습니다. serving_num API는 이벤트 ID로 호출되고 대기열의 현재 제공 위치를 반환합니다. serving_num API의 응답은 대기실에서 최종 트랜잭션이 발생할 수 있는 실제 대상 사이트로 이동할 수 있는 시기를 클라이언트에게 알려줍니다. GetServingNum Lambda 함수는 대기실의 현재 서빙 위치를 반환합니다.

  2. 제공 위치가 클라이언트의 대기열(요청) 위치와 같거나 크면 클라이언트는 퍼블릭 API에서 JSON 웹 토큰(JWT)을 요청할 수 있습니다. 토큰은 대상 사이트와 함께 사용하여 트랜잭션을 완료할 수 있습니다. generate_token API는 이벤트 ID 및 요청 ID와 함께 호출됩니다. API Gateway는 파라미터와 함께 GenerateToken Lambda 함수를 호출합니다.

  3. GenerateToken Lambda 함수는 요청을 검증하고이 토큰이 이전에 생성되었는지 확인합니다. Lambda 함수는 DynamoDB 테이블에서 일치하는 토큰을 쿼리합니다. 이 토큰이 발견되면 호출자에게 반환되고 다시 생성되지 않습니다. 이 프로세스는 단일 요청 ID를 사용하여 새 만료 시간으로 여러 개의 서로 다른 토큰을 생성하는 것을 방지합니다.

  4. DynamoDB에서 토큰을 찾을 수 없는 경우 Lambda 함수는 키를 검색하여 토큰을 생성하고 이벤트 ID 및 클라이언트의 요청 ID와 함께 DynamoDB에 토큰을 저장합니다. Lambda 함수는 EventBridge에 이벤트를 작성하여 새 토큰이 생성되었음을 알립니다. Lambda 함수는 이벤트에 대해 생성된 토큰 수를 추적하는 Elasticache(Redis OSS) 카운터를 증가시킵니다.

  5. queue_pos_expiry이 켜져 있으면 클라이언트는 GetQueuePositionExpiryTime Lambda 함수를 호출하는 queue_pos_expiry API를 호출하여 만료 전 남은 시간을 쿼리할 수 있습니다.

사용자가 대기실을 떠납니다.

  1. 클라이언트는 토큰을 수신하면 대상 사이트에 들어가 트랜잭션을 시작합니다. 인프라가 JWT와의 통합을 지원하는 방식에 따라 클라이언트는 요청 헤더, 쿠키 또는 다른 방법으로 토큰을 제시해야 할 수 있습니다. API Gateway에 대한 권한 부여자를 사용하여 클라이언트 요청에 포함된 토큰을 검증할 수 있습니다. JWTs를 검증하고 관리하기 위한 모든 상용 또는 오픈 소스 라이브러리는 AWS 토큰의 가상 대기실과 함께 사용할 수 있습니다. 토큰이 유효한 경우 클라이언트는 트랜잭션을 계속할 수 있습니다.

  2. 클라이언트가 트랜잭션을 완료하면 프라이빗 API가 호출되어 클라이언트 토큰의 상태를 업데이트하고 DynamoDB에서 완료됩니다.

대기열 위치 만료:

  1. 이 기능이 활성화되면 특정 대기열 위치에 해당하는 요청 ID는 지정된 시간 간격 동안만 토큰을 생성할 수 있습니다.

대기열 위치 만료 시 증분 서빙 카운터:

  1. 이 기능이 활성화되면 토큰을 생성할 수 없었던 만료된 대기열 위치에 따라 서빙 카운터가 자동으로 증가합니다.