AWS SQS로 병목현상 해결하기

nichol·2022년 7월 12일
0

AWS

목록 보기
2/2

본 내용은 기업인턴과정에서 발생했던 내용을 정리한 내용입니다.

1. 과제내용

  • 이전블로그 에서 확인했듯이 1만개의 request가 DB에 저장이안되고 아주 일부만 저장됨을 확인
  • 이번에는 gateway > lambda > SQS > lambda > DB 의 플로우로 1만개의 request를 저장해봐라

2. 용어 정리 및 개념정리

1. SQS

2. 왜 request의 대부분이 실패 했을까.

  • 처리속도에 차이에서 발생한다.
  • RDS의 쓰기속도와 gateway에서 전달하는 data를 Lambda function에서 RDS에서 전달하는 속도에 차이에서 병목현상 발생

3. SQS를 쓰는 이유

  • 위의 병목현상을 줄이기위해 첫번째 Lambda functions으로 데이터를 받는 속도가 월등히 빠른 메모리를 활용한 Q를 배치해 일단 모든 데이터를 SQS에 저장한뒤에 Q로 정렬한뒤에 하나씩하나씩 두번째 Lambda function으로 속도가느린 RDS에 병목없이 전달하기위해 사용
  • SQS말고도 Q의 역할을 해주는 패키지들이 존재 (ex : redis)

3. 목표 1 gateway > 첫번째 Lambda > SQS 구현해보자

  • 일단 두번째 과제에서 lambda와 RDS연결은 된것으로 확인되었으니 먼저 SQS를 활용해 Q를 이용한 대기열이 정상적으로 만들어지는 지 확인
  • SQS를 만들고 SQS 엔드포인트를 lambda 환경변수에넣고 boto3를 활용해 연결
  • lambda funstion은 SQS에 메세지를 전달하는 로직을 검색해 적용
    import json
    import os
    import boto3
    import logging
    
    from botocore.exceptions import ClientError
    
    def lambda_handler(event, context):
        e=event["name"]
        _params = {'name': e}
        msg_body = json.dumps(_params)
        msg = send_sqs_message(os.environ['SQS_QUEUE'], msg_body)
        return msg
    
    def send_sqs_message(sqs_queue_url, msg_body):
    
        sqs_client = boto3.client('sqs')
        try:
            msg = sqs_client.send_message(QueueUrl=sqs_queue_url,
                                          MessageBody=msg_body)
        except ClientError as e:
            logging.error(e)
            return None
        return msg
    참고 : https://sehajyang.github.io/2019/09/25/sqs-lambda-python/
  • lambda에 gateway를 연결하여 thread를 활용해 request를 받도록 설정
  • 요청을 보내 일일이 한줄한줄 print()찍어보면서 확인
  • 또한 lambda에서 제공하는 CloudWatch Logs 에서 로그이벤트들을 확인하면서 진행

  • SQS에서는 모니터링에서 메세지가 정확하게 들어오는지 확인
  • 아직은 SQS랑 lambda/RDS는 연결하지않았으니 수신된메시지수에 정확하게 request 갯수 확인
  • 문제점 발견
    • 처음에 테스트로 1000개의 스레드를 생성하고 1000개의 데이터를 넣는데 SQS를 쓰면 모든 데이터가 정상적으로 들어와야하나 여전히 데이터가 10~30%만 전송되는 현상 발생 ⇒ AWS_lambda는 데이터의 양에 따라 가변적으로 lambda인스턴스가 늘어났다가 줄어들었다하는데 무료로 사용할때는 최대 50개이고 그 이상의 인스턴스가 늘어나게 설정한다면 비용이든다는 사실 확인

    • request를 하는 코드에서 thread를 최대 50개로 설정 1000개의 데이터를 request를 하면 정상적으로 메시지 수신되는것을 확인

4. 목표 4 : 두번째 Lambda function에 트리거(SQS) 장착

  • SQS에 수신된 메세지를 전송대상을 설정해주면 SQS에서 별다른 설정없이 Lambda function으로 request data를 전송한다.
  • 이 이후에는 두번째 과제에서와 동일한 방식으로 RDS에 정상적으로 등록이 된다.

5. 결론

  • 이번 과제로 병목현상에 대해 직접 실습을 통해 해결하는 과정을 해보았다.
  • 이전 프로젝트에서는 대량의 데이터들을 한번에 받는 작업을 해보지못해 병목현상을 격어본적이 없지만 현업에서는 수십 수백명이 동시에 접속하는 request진행될때 어떠한 현상이 일어나는지 간접적으로 체험해봤으며, 이를 해결하기위해 Q를 사용한 대기열을 두어 이를 해결하는 것을 이번 과제를 통해 이해했다.
  • 단순히 AWS에서 제공되는 SQS와 Lambda, RDS, gateway를 이용해서 경험해보았지만 전반적인 구조파악에는 많은 도움이 되었다고 생각된다.
profile
WEB Developer

0개의 댓글