프로젝트 3: 마이크로서비스
인프라 아키텍쳐
구성 요소
1. Sales API
2. Factory API
3. 프론트엔드(웹사이트) : cURL / postman / k6 등을 통한 API 호출로만 구현
4. 백엔드(서버) : 구매 시 창고에서 재고 확인 후 재고 감소 로직 구현
5. 데이터베이스(창고) : RDS에 mysql db 구성
상황
비효율적인 레거시 시스템 때문에 고객의 불만사항이 접수되고 있습니다. 제품별 재고부족 요청이 빈번하게 발생되고 있지만 전달 과정에서 지연과 누락 등 문제 상황이 발생하고 있습니다. 안정적으로 요청이 전달 될 수 있도록 시스템을 개선해야합니다. 비정상적으로 처리된 요청의 경우 운영팀에 상황을 알려야합니다.
Day2
Step 1 : Lambda 서버(Sales API) - DB 연결
1. 우선 local에서 테스트하기 위해 .env 파일에 환경변수를 설정해 database.js에 변수를 넣어주었습니다
2. serverless를 통해 lambda를 생성한다면 환경변수로 등록하는 방법을 고려해 볼 수 있습니다.
: serverless framework는 config를 이용한 환경변수 설정을 지원하기 때문에 현재 폴더에 config/config.js를 생성하여 환경 변수를 설정해 주었습니다
> 여기서 민감정보를 감추기 위해서 /config/config.js 파일을 생성하여, env 파일을 쓰는 식으로 사용하였습니다
3. cURL 요청을 통해 데이터베이스의 재고 정보에 따라 다른 응답을 보내는 것을 확인합시다. handler.js의 소스 코드를 읽어보고 어떻게 요청해야 하는지 발견하세요. (초기 재고 3)
> 위의 사진과 같이 get이랑 post 요청으로 되어있기 때문에 두 개의 path가 작동합니다
1. get 요청
2. post 요청
Step 2 : “재고 없음” 메시지 전달 시스템 구성
1. DB에 재고가 없을 경우 재고가 없다는 정보를 알리기 위한 SNS 토픽(stock_empty) 생성
aws 콘솔을 이용해서 생성하였고, SNS 구독에 SQS를 추가하였습니다
2. stock_empty 토픽을 구독하는 SQS(stock_queue) 생성
1번과 같이 콘솔로 생성하였고, SQS 엑세스 정책을 수정하여 SNS에서 오는 메세지가 접근 가능하도록 수정하였습니다
3. 다음 code snippet을 활용하여 재고 부족 메시지를 SNS에 발행
> DB에서 재고를 확인 하는 코드 사이에 넣어서 만약 재고가 없다면 sns를 통해 재고를 증가시키는 lambda를 트리거 하도록 구성하였습니다.
> sns를 사용하기 위해 serverless.yaml에 sns ARN을 TOPIC_ARN에 삽입했습니다
Step 3 : 메시지를 Factory API로 전송하는 Lambda 구성 및 DLQ 추가
1. 가용성을 높이기 위한 DLQ를 stock_queue에 연결
aws 콘솔로 'stock_queue_DLQ'로 sqs를 하나 생성하고, 배달 못한 편지 대기열에 'stock_queue'를 추가하여 메시지가 lambda로 전달되지 못할 시 DLQ가 처리하도록 구성하였습니다
2. stock_queue에 들어온 메시지를 소모하기 위한 stock_lambda 구성
delay 함수를 이용해 lambda의 타임아웃을 조정해 주었고, 'stock_queue'에서 오는 메시지를 처리하도록 event를 받아서 사용하도록 구성하였습니다
> functions 밑에 events에 'stock_queue'를 작성해서, trigger로 연결해 주었습니다
Step 4 : 데이터베이스의 재고를 증가시키는 Lambda 함수 생성
stock_lambda에서 레거시 시스템(Factory API)에 제품 생산 요청하여
데이터베이스 재고를 증가시키기 위해서 sales_API와 stock-increase-lambda를 수정하였습니다
> stock_lambda에서 이 요청을 받아서 전달할 수 있도록 MessageAttributes 문을 추가했고, stock-increase-lambda에 전달하여 데이터베이스 재고를 증가시키도록 CallbackUrl을 추가하여 연결시켜 주었습니다
야크쉐이빙
1. step1
> lambda에 데이터베이스를 연결할 때, 연결 이후 post 요청 구문을 잘못 써서 응답이 돌아오지 않는 문제가 있었습니다.
2. step4
> 재고 증가 요청이 완료된 후, 데이터베이스의 재고가 늘어나지 않는 문제가 있어서 확인해 보니 'req.body.stock'에 대한 값이 'undefined' 여서 재고가 늘어 나지 않았던 것이었습니다.
> 이후 req.body.MessageAttributeProductCnt를 이용해서 요청을 통해 들어오는 값으로 수정해주었습니다