Project 3: Day 2

이준석·2023년 2월 20일
0

Project 3

목록 보기
3/5

목표

  • 메시지 큐의 Pub/Sub 패턴과 Producer/Consumer 패턴의 차이를 이해한다.
  • DB와 서버와의 통신이 가능하도록 연결한다.
  • 특정 상황에서 SNS, SQS로 메세지가 전달되도록 시스템을 구성한다.
  • SQS에 들어온 메세지를 레거시 시스템(Factory API)으로 전달하는 시스템을 구성한다.
  • 레거시 시스템(Factory API)의 콜백 대상이되는 리소스를 생성해 데이터베이스에 접근 할 수 있게 한다.


Step 1 : Lambda 서버(Sales API) - DB 연결

  1. sales-api 디렉토리에서 Sales API를 확인할 수 있습니다.

  2. 데이터베이스 연결

  • 데이터베이스가 개별 제공됩니다.
    로컬에서는 .env 파일을 활용하며, 배포시에는 AWS 콘솔에서 직접 입력합니다.
    코드에 credential을 넣지 않도록 주의하세요.

트러블 슈팅 발생

  • (advanced) serverless를 통해 lambda를 생성한다면 환경변수로 등록하는 방법을 고려해볼 수 있습니다.

  1. 연결 후 레포지토리의 sales-api/init.sql을 참고하여 자신의 데이터베이스에 테이블을 생성하고 재고를 추가하세요.
  • 데이터 베이스 선택
show databases;
use junnn0021;
  • 현재 데이터베이스에 있는 테이블 조회
show table status;
  • 테이블의 열이 무엇이 있는지 조회 (DESCRIBE=DISC)
describe <테이블이름>;
  • 테이블 내의 데이터 조회
select <열이름> from <테이블이름>;

  1. cURL 요청을 통해 데이터베이스의 재고 정보에 따라 다른 응답을 보내는 것을 확인합시다.
    handler.js의 소스 코드를 읽어보고 어떻게 요청해야 하는지 발견하세요. (초기 재고 3)

로컬

curl -X GET loaclhost:8080
{"product_id":"ecb20045-b0b8-11ed-8e89-069658f3b1c6","name":"부산도너츠","price":19900,"stock":3,"BIN_TO_UUID(factory_id)":"9d2b8119-b0b8-11ed-8e89-069658f3b1c6","BIN_TO_UUID(ad_id)":"9fcfd19d-b0b8-11ed-8e89-069658f3b1c6"}

curl -X POST localhost:8080/checkout
{"message":"구매 완료 ! 남은 재고 : 2"}
{"message":"구매 완료 ! 남은 재고 : 1"}
{"message":"구매 완료 ! 남은 재고 : 0"}
{"message":"구매 실패! 남은 재고: 0"}

람다

curl -X POST https://aklbebq5rk.execute-api.ap-northeast-2.amazonaws.com/checkout
{"message":"구매 실패! 남은 재고: 0"}



Step 2 : “재고없음” 메세지 전달 시스템 구성



  1. DB에 재고가 없을 경우 재고가 없다는 정보를 알리기 위한 SNS 토픽(stock_empty) 생성



  1. stock_empty 토픽을 구독하는 SQS(stock_queue) 생성



  1. 다음 code snippet을 활용하여 재고 부족 메시지를 SNS에 발행
  • 다음 코드를 적절한 곳에 붙여넣어야 합니다.
  • 환경변수 TOPIC_ARN이 필요합니다.

트러블 슈팅 발생


  1. cURL을 통해 재고가 없을 때까지 요청을 보냄



Step 3 : 메세지를 Factory API로 전송하는 Lambda 구성 및 DLQ 추가



  1. 가용성을 높이기 위한 DLQ를 stock_queue에 연결

  2. stock_queue에 들어온 메세지를 소모하기 위한 stock_lambda 구성

  • stock-lambda 프로젝트 및 코드는 제공되지 않습니다. 여러분이 배운 방법을 활용하여 직접 람다 함수를 생성하세요.
module.exports.hello = async (event) => {
  await delay(15000)
  console.log(event)
  return event
}
function delay(time) {
  return new Promise(resolve => setTimeout(resolve, time));
}

module.exports.hello = async (event) => {
  await delay(15000)
  console.log(event)
  return event
}
  • 람다 함수의 로그(CloudWatch)를 통해 stock_queue로부터 오는 메시지를 확인할 수 있다면 성공입니다.

0개의 댓글