- GET 메서드이지만 해당 기능을 타고타고 들어가면 수정이나 등록이 이루어지는 경우가 있었던 적이 있는지
- GET 요청은 멱등하다고 하는데, 목록 조회할 때마다 리스트가 달라질 때도 있다. 그래도 멱등하다고 생각하는지?
- 멱등하게 API를 개발한 적이 있는지?
- 요청한 데이터가 없을 때 HttpStatus 상태 코드로 404 NotFound가 맞을까? 200 OK가 맞을까?
- Delete 메서드에 대한 멱등성을 구현하기 위해서는 처음 삭제할 때와 이미 삭제되었을 때의 HttpStatus를 맞추어야하는 것인가? page 202
명품 판매 사이트는 결제된 내역을 기반으로 일일 판매량 랭킹을 산출하여 사용자에게 보여준다. 이 사이트의 서비스들은 MSA 구조로 되어 있으며, 랭킹 기능은 결제 도메인에서 자정마다 스프링 스케줄링을 이용해 수행된다. 구체적으로, 결제된 내역이 많은 상위 10개의 상품 데이터를 DB에서 불러와 별도의 랭킹 테이블에 저장하고, 클라이언트는 해당 날짜의 랭킹 데이터를 불러와서 출력한다.
평소에는 결제 도메인에 문제가 없었으나, 어느 날 결제 도메인에 감당할 수 없는 트래픽이 발생하여 스케일 아웃이 필요해졌다. 이 작업은 오후 11시 50분에 이루어졌고, 트래픽이 언제 떨어질지 모르는 상황이었기 때문에 다음 날까지 스케일 아웃 상태를 유지하기로 결정했다.
그러나, 이로 인해 자정이 되었을 때 두 대의 결제 서버가 동시에 스케줄링 작업을 수행하게 되어, 랭킹 데이터가 랭킹 테이블에 중복으로 삽입되는 문제가 발생했다. 결과적으로 클라이언트 페이지에서는 20개의 데이터를 수신하며 에러가 발생하게되었다. 중복되어 실행되는 스케줄링 문제를 어떻게 해결할 수 있을까? (회사 내의 비용적인 문제로 별도의 서버를 생성하여 스케줄링만 전담하는 서버를 구축할 수 없다고 가정한다.)
정해진 답은 없으나 아래와 같은 방법으로 처리 가능
- 중앙 집중식 스케줄링 서버를 구축
- 데이터베이스를 통한 동기화(Quartz에는 DB를 기반으로 클러스터링을 해줌)
- 작업시 데이터베이스에 작업 기록을 해두고, 다른 서버에서는 이 데이터를 확인 후 진행할 것인지 안할 것인지 처리하는 방법
- Redis를 활용한 분산 락, DB 네임드락을 이용
- 리더 선출 시스템