본문 바로가기
AWS/Solutions

Virtual Waiting Room on AWS - Inlet strategy

by 여행을 떠나자! 2022. 8. 21.

1. 개요

- 목적

   Virtual Wainting Room 사용 시 동시 처리량을 조절하는 Inlet strategy를 이해하고 활용한다.

- Virtual Waiting Room?

   이 솔루션은 대량 트래픽 버스트 발생 시 웹사이트로 수신되는 사용자 요청을 버퍼링 할 수 있는 기능을 제공한다.

   Virtual Waiting Room on AWS

 

 

2. Inlet strategy

- 타겟 사이트에 더 많은 사용자를 수용하기 위하여 Virtual Waiting Room의 Serving counter에 대하여 증가 시점과 증가량을 결정할 때 사용되는 전략이다.

- Inlet strategy를 이해하기 위해서는 ElastiCache for Redis에서 관리하는 Serving count와 Queue counter의 의미를 알아야 한다. 참고로 각 Counter의 상한 값은 9,223,372,036,854,775,807이다. 만약 상한 값에 도달했다면 리셋을 해야 한다. 

   Serving counter: 타겟 사이트에서 제공할 수 있는 요청 수 

    Queue counter: 타겟 사이트에서 제공된 요청 수

    서비스 가능한 요청 수 = Serving counter - Queue counter

- 솔루션에서 Inlet strategy로 Periodic과 MaxSize 2가지 예제를 제공하고 있다.

- Periodic
    CloudWatch 룰이 1분 주기로 PeriodicInlet 람다 함수를 호출하여 지정된 수만큼 Serving counter를 증가시키는 전략이다.
    파라미터
       ▷ event start time, end time: 람다 함수가 실행되는 시간 범위
       ▷ increment ammount: Serving count 증가 단위
       ▷ CloudWatch custorm alarm (option): 설정된 alarm이 ok일 때 람다 함수 동작

- MaxSize
    MaxSizeInlet 람다 함수는 타켓 사이트가 동시에 수용할 수 있는 최대 클라이언트 수로 구성하는 전략이다.
    SNS 토픽({stack-name}-inlet-strategy-MaxSizeInletSns-*)에 퍼플리시되면 MaxSizeInlet 람다 함수가 호출된다.
    람다 함수는 아래 메시지를 이용하여 얼마만큼 Serving counter를 증가시킬지 결정한다.
    SNS(Simple Notification Service) 토픽 메시지
       ▷ completed: list of request IDs to be marked completed
       ▷ abandoned: list of request IDs to be marked abandoned
       ▷ exited: number of transactions that have completed

 

3. Prerequisites

- AWS CloudFormation에서 aws-virtual-waiting-room-getting-started.template를 배포한다.

   ✓ 배포에 관한 자세한 내용은 Virtual Waiting Room on AWS를 참조하면 된다.
    https://solutions-reference.s3.amazonaws.com/aws-virtual-waiting-room/latest/aws-virtual-waiting-room-getting-started.template
- 배포가 완료되면 총 3개의 stack(CoreModule, AuthorizerModule, SampleModule)이 생성된다. 생성된 stack의 parameter와 output은 아래와 같다.
    CloudFormation stack parameters

    CloudFormation stack outputs

 

4. Sample Inlet strategy - Periodic

A. Periodic strategy 배포
- AWS CloudFormation에서 aws-virtual-waiting-room-sample-inlet-stragegy.template를 배포한다.
    https://solutions-reference.s3.amazonaws.com/aws-virtual-waiting-room/latest/aws-virtual-waiting-room-sample-inlet-strategy.template
- 배포시 다음과 같이 stack명과 파라미터를 입력한다.

    EventId와 PrivateCoreAPIEndPoint 파라미터는 각자 환경에 설치된 core stack의 parameter와 output 값을 참조해서 입력한다.
   Inlet strategy는 Periodic를 선택한다.

    IncrementBy 파라미터는 1분 주기로 Serving counter를 증가시킬 값으로 10을 입력한다. 각자 운영할 타켓 사이트의 처리 용량을 고려해서 적절한 값을 입력하면 된다.
    StartTime, EndTime 파라미터는 Periodic strategry가 수행될 시작 시간과 종료 시간이다. 디폴트 값을 사용해도 된다.

 

B. Periodic strategy 배포 리소스 확인
- CloudFormation stack이 배포한 리소스는 다음과 같다.

- 배포된 EventBridge rule로 PeriodicInlet 람다 함수를 1분 주기로 호출하도록 설정되어 있다. 주기는 변경할 수 있다.

- 배포된 PeriodicInlet 람다 함수는 아래와 같다. 람다가 실행 시 참조하는 Serving counter는 INCREMENT_BY 환경변수로 전달된다. 아래와 같이 해당 변수를 수정하면 람다 함수가 실행 시 바로 참조한다.

 

C. Periodic strategy 동작 확인
- CloudFormation SampleModule stack에서 설치된 Control Panel UI에 접속 후 Serving Position 값을 살펴보면 1분 단위로 10씩 증가됨을 확인할 수  있다.

 

D. Periodic strategy 개선 방안
- Sample Periodic strategy은 특정 조건에서 의도하지 않게 트래픽이 폭증할 수 있다. 예를 들어 Serving counter가 1분 단위로 10씩 증가하고 주기마다 요청이 10보다 적었던 상황에서 18:13분에 40개 요청이 발생되면 30개 요청이 Waiting room에서 빠져나가 서비스 요청을 하게 된다. 나머지 10개는 Waiting room에 머무르게 된다.

- Periodic stragegy에 아래 2가지를 적용하면 위와 같은 현상을 개선할 있다.
    주기 단축: EventBridge rule에서 PeriodicInlet 람다 함수 호출 주기를 1분에서 각 사이트의 상황에 맞게 변경
    증가 량 로직 변경: PeriodicInlet 람다 함수에서 주기마다 INCREMENT_BY 만큼 증가하는 로직을 변경
        ▷ 기존: Serving count + INCREMENT_BY
        ▷ 개선: Serving count + NEW_INCREMENT_BY = INCREMENT_BY - (Serving counter - queue counter)
             0 < NEW_INCREMENT_BY <= INCREMENT_BY

 

- Virtual Waiting Room 솔루션에서는 Queue counter를 조회하는 API를 제공하지 않기 때문에 추가로 개발해야 한다. 해당 값은 ElastiCache for Redis에서 조회할 수 있다.

$ wget https://redismodules.s3.amazonaws.com/redis-stack/redis-stack-server-6.2.2-v4.rhel7.x86_64.tar.gz
...
$ tar xzf redis-stack-server-6.2.2-v4.rhel7.x86_64.tar.gz
...
$ sudo cp redis-stack-server-6.2.2-v4/bin/redis-cli /usr/bin
...
$ export REDISCLI_AUTH='Mpz5xAdJ3V$v$HvUn8W2WW2IK>>lA7nIc>^&$l!RDV!mN$-c95Ek!F>Xl>iGdULOk^<XC9lBYl1R5u79iase<5i&fy^QVbYqQJ52-#KB4Cd$J9tLAmoCfj275pPAZaNR'
$ redis-cli -h master.awr13mgas2awt4tf.odcoyh.apn2.cache.amazonaws.com -p 1785 --tls
master.awr13mgas2awt4tf.odcoyh.apn2.cache.amazonaws.com:1785> get queue_counter
“61”
master.awr13mgas2awt4tf.odcoyh.apn2.cache.amazonaws.com:1785> get serving_counter
"51"
master.awr13mgas2awt4tf.odcoyh.apn2.cache.amazonaws.com:1785>

    설치된 ElastiCache 클러스터명은 CloudFormation {stack-name}-CoreModuleStack의 리소스 탭에서 조회한다.

    ElastiCache 클러스터 엔드포인트(호스트) 명은 ElasitCache 콘솔에서 조회한다.

    Redis 암호는 Securets Manager 서비스의 Secret value 탭에서 조회한다.

    Redis의 키를 조회하는 로직은 '{stack-name}-CoreModuleSta-GetQueueNum-*'에서 참조할 수 있다.

 

5. Sample Inlet strategy - MaxSize

A. MaxSize strategy 배포
- CloudFormation에서 aws-virtual-waiting-room-sample-inlet-stragegy.template를 배포한 경우 업데이트를 통해 MaxSize strategy를 배포할 수 있다.

 

B. MaxSize strategy 배포 리소스 확인

- CloudFormation stack이 배포한 리소스는 다음과 같다.

- 배포된 MaxSizeInlet 람다 함수는 아래와 같다. 람다가 실행 시 참조하는 Max Size 값은 환경변수에 정의되어 있다. 

 

C. MaxSize strategy 동작 확인

- Control panel UI의 Increment Serving counter를 이용하여 Serving counter를 MaxSize와 같게 한다.

- Waiting room UI를 이용하여 2개의 요청을 발생시킨다. 

- Waiting room UI에서 ‘Check out now’를 클릭 시 Waiting room에서 나오게 되고 JWT 토큰이 발급된다. DynamoDB에서 각 요청에 대한 request_id와 JWT 토큰을 조회된다.

- MaxSize를 3으로 설정하였기 때문에 추가 요청이 발생될 경우 1개 요청은 Waiting room에서 나오게 되며, 나머지는 Waiting room에서 대기하게 된다. 

- SNS topic에 Waiting room을 나온 2개의 요청에 대하여 완료 요청하면 {stack-name}-inlet-stragegy-MaxSizeInlet-* 람다 함수가 호출되며, 람다 함수는 발급된 JWT 토큰을 종료시키고 Serving counter를 증가시킨다.

    CloudWatch에서 람다 함수의 로그를 조회한 내용이다. Serving counter가 3에서 5로 증가하였다.

    DynamoDB에서 발급되었던 JWT 토큰의 상태는 완료로 변경되었으며, Active Token은 2에서 0으로 변경되었다.

 

- SNS topic에 abandoned 메시지를 전달할 경우 completed와 동일하게 동작된다. 다만 DynamoDB에서 조회하면 session_status 값만 다르다.

 

D. MaxSize strategy 고려사항
- 적용할 시스템의 처리 용량을 고려해서 MaxSize를 설정한다.
- 클라이언트 세션 사용이 완료되면 SNS에 Completed 메시지를 전달해서 세션에 발급된 토큰을 사용 중지시킨다.
- 클라이언트가 세션 완료 로직을 호출할 수 없을 경우를 고려하여, 적절한 세션 타임아웃을 설정한다.


6. 참고 사이트

- https://docs.aws.amazon.com/solutions/latest/virtual-waiting-room-on-aws/solution-components.html

- https://docs.aws.amazon.com/solutions/latest/virtual-waiting-room-on-aws/design-considerations.html

'AWS > Solutions' 카테고리의 다른 글

Virtual Waiting Room on AWS  (3) 2022.08.09

댓글