시나리오
<도넛-스테이츠>는 온라인으로 도너츠를 판매합니다.
웹사이트를 통해서 주문 버튼을 누르는 것으로 구매(Sales API)가 가능합니다.
창고에 재고가 있다면 재고가 감소하고 구매가 완료됩니다.
유튜브스타 hoyong.LEE가 도넛-스테이츠의 도너츠가 맛있다고 영상을 올렸습니다.
그를 따르는 데브옵스 수강생들이 몰려듭니다. 주문이 급등합니다.
창고에 재고가 없기 때문에 구매가 불가능한 경우가 발생합니다.
창고의 도너츠 재고가 다 떨어지면 제조 공장에 알려서 다시 창고를 채우는 시스템을 구축해야합니다.
제조 공장인 <팩토리-스테이츠>에 주문을 요청(Leagcy Factory API)할 수 있습니다.
주문이 요청되면 일정 시간이 지난 후 창고에 재고가 증가합니다.
요구사항 1 : 재고부족으로 인한 구매실패에 대한 조치
- Sales API 를 통해 요청을 받은 서버가 데이터베이스에서 재고 상황을 확인합니다.
- 재고가 있다면 감소시키고 응답으로 판매완료 내용을 전달합니다.
- 재고가 없는 경우 공장에 주문을 진행합니다
- 재고가 없다는 내용을 담은 메세지 페이로드가 주제별로 생성됩니다.
- 메세지가 느슨하게 연결된 시스템을 통해 처리될 수 있도록 따로 보관됩니다.
요구사항 2 : 메세지 누락 상황에 대한 조치
- 빈번한 요청으로 메세지 누락이 발생합니다.
- 비동기 처리를 위해 보관 된 메세지가 처리되지 않은 경우 메세지들을 체계적으로 관리할 다른 처리 공간을 생성해야합니다.
- 메시지 처리 보관 리소스와 처리되지 않은 메세지 처리 리소스가 연결되어야합니다.
요구사항 3 : Legacy 시스템(Factory → Warehouse) 성능문제에 대한 조치
- 안정적으로 이벤트가 전달 될 수 있는 시스템을 구축해야합니다.
- 메세지를 소비하는 리소스를 통해 Factory API가 호출됩니다.
- 수신된 메세지에 의해 트리거가 된 컴퓨팅 리소스가 상품 재고를 증가시킵니다.
설계한 다이어그램
구현된 설계 사항
- API 게이트웨이를 트리거로 하는 백엔드 람다 서버
- SNS, SQS 시스템을 트리거로 하는 생산 요청 람다 서버
- 전달되지 않은 요청에 대한 장애 조치(DLQ)
- 외부 서버(Factory)에서 데이터를 업로드할 S3
- S3로 부터 트리거 받아 재고 현황을 SQS에 전달하는 람다 함수
- SQ로 부터 트리거 받아 재고 현황을 업데이트 하는 람다 함수
미비된 설계 사항
- 재고 현황 업데이트 시 전달되지 않은 요청에 대한 장애 조치
Proejct의 진행 시작부터 MSA 아키텍처를 다이어그램으로 설계하려 하니 꽤나 어려웠다. 팀원들끼리 이게 맞지 않을까요? 저게 맞지 않을까요? 정말 많은 이야기를 하면서 설계를 마칠 수 있었다.
구현은 이제... 다음주의 나의 몫이니.. 잘 진행해 봐야겠다.